如何在C#中获取unicode字符的十进制值?

Ian*_*oyd 13 c# string unicode localization

如何在C#中获取unicode字符的数值?

例如,如果给出泰米尔字符?(U + 0B85),则输出应为2949(即0x0B85)

也可以看看

多个代码点字符

某些字符需要多个代码点.在这个例子中,UTF-16,每个代码单元仍然在Basic Multilingual Plane中:

  • 在此输入图像描述(即U+0072 U+0327 U+030C)
  • 在此输入图像描述(即U+0072 U+0338 U+0327 U+0316 U+0317 U+0300 U+0301 U+0302 U+0308 U+0360)

更重要的是,一个"字符"可能需要超过1个UTF-16代码单元,它可能需要2个以上的UTF-16代码单元,它可能需要3个以上的UTF-16代码单元.

更重要的是,一个"字符"可能需要几十个unicode代码点.在C#中的UTF-16中意味着超过1 char.一个角色可能需要17个char.

我的问题是关于转换char为UTF-16编码值.即使整个17的字符串char只代表一个"字符",我仍然想知道如何将每个UTF-16单位转换为数字值.

例如

String s = "?";

int i = Unicode(s[0]);
Run Code Online (Sandbox Code Playgroud)

其中Unicode返回Unicode标准定义的整数值,用于输入表达式的第一个字符.

Jon*_*eet 20

它与Java基本相同.如果你把它作为一个char,你可以int隐式转换为:

char c = '\u0b85';

// Implicit conversion: char is basically a 16-bit unsigned integer
int x = c;
Console.WriteLine(x); // Prints 2949
Run Code Online (Sandbox Code Playgroud)

如果你把它作为字符串的一部分,那么首先得到那个单个字符:

string text = GetText();
int x = text[2]; // Or whatever...
Run Code Online (Sandbox Code Playgroud)

请注意,不在基本多语言平面中的字符将表示为两个UTF-16代码单元.还有支持.NET中的查找完整的Unicode代码点,但它不是简单的.

  • @ Serge-appTranslator:看看`char.ConvertToUtf32(string,int)`,`char.IsLowSurrogate`等. (3认同)

svi*_*ick 7

((int)'?').ToString()
Run Code Online (Sandbox Code Playgroud)

如果您将角色作为a char,则可以将其强制转换为a int,这将表示角色的数值.然后,您可以以任何您喜欢的方式打印出来,就像使用任何其他整数一样.

如果你想要十六进制输出,你可以使用:

((int)'?').ToString("X4")
Run Code Online (Sandbox Code Playgroud)

X用于十六进制,4用于零填充到四个字符.


Bra*_*vic 5

\n

如何在 C# 中获取 unicode 字符的数值?

\n
\n\n

Achar不一定是整个 Unicode代码点。在 UTF-16 编码语言(例如 C#)中,您实际上可能需要 2char来表示单个“逻辑”字符。并且您的字符串长度可能不是您所期望的 - String.Length 属性的 MSDN 文档说:

\n\n

“Length 属性返回此实例中 Char 对象的数量,而不是 Unicode 字符的数量。”

\n\n
    \n
  • 因此,如果您的 Unicode 字符仅以 1 进行编码char,那么它就已经是数字(本质上是一个无符号 16 位整数)。您可能希望将其转换为某些整数类型,但这不会改变char.
  • \n
  • 如果您的 Unicode 字符为 2 char,您需要将 1 乘以 2^16 并将其与另一个相加,得到一个uint数值:

    \n\n

    字符 c1 = ...;
    \n字符 c2 = ...;
    \nuint c = ((uint)c1 << 16) | c2;

  • \n
\n\n
\n

如何在 C# 中获取 unicode 字符的十进制值?

\n
\n\n

当您说“十进制”时,这通常意味着仅包含人类将其解释为十进制数字的字符的字符串。

\n\n
    \n
  • 如果您只能用 1 来表示您的 Unicode 字符char,则可以通过以下方式将其简单地转换为十进制字符串:

    \n\n

    char c = \'\xe0\xae\x85\';
    \n字符串 s = ((ushort)c).ToString();

  • \n
  • 如果您chars的 Unicode 字符有 2 个,请uint按照上述方式将它们转换为 a,然后调用uint.ToString.

  • \n
\n\n

- - 编辑 - -

\n\n

AFAIK 变音标记被认为是单独的“字符”(和单独的代码点),尽管在视觉上与“基本”字符一起呈现。这些代码点中的每一个单独计算仍然最多为 2 个 UTF-16 代码单元。

\n\n

顺便说一句,我认为你所说的正确名称不是“字符”,而是“组合字符”。所以是的,单个组合字符可以有超过 1 个代码点,因此可以有超过 2 个代码单元。如果您想要诸如组合字符之类的十进制表示形式,您可能可以通过以下方式最轻松地做到这一点BigInteger

\n\n
string c = "\\x0072\\x0338\\x0327\\x0316\\x0317\\x0300\\x0301\\x0302\\x0308\\x0360";\nstring s = (new BigInteger(Encoding.Unicode.GetBytes(c))).ToString();\n
Run Code Online (Sandbox Code Playgroud)\n\n

根据您希望的代码单元“数字”的重要性顺序,您可能需要反转c.

\n