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

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

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

也可以看看

  • C ++: 如何在c ++中获取unicode字符的十进制值
  • Java: 我如何获得Unicode字符的代码?

多个代码点字符

某些字符需要多个代码点。 在这个例子中,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个字符串只代表一个“字符”,我仍然想知道如何将每个UTF-16单位转换为数字值。

例如

 String s = "அ"; int i = Unicode(s[0]); 

其中Unicode返回输出表达式的第一个字符的Unicode标准定义的整数值。

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

 char c = '\u0b85'; // Implicit conversion: char is basically a 16-bit unsigned integer int x = c; Console.WriteLine(x); // Prints 2949 

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

 string text = GetText(); int x = text[2]; // Or whatever... 

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

 ((int)'அ').ToString() 

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

如果你想要hex输出,你可以使用:

 ((int)'அ').ToString("X4") 

X表示hex, 4表示零填充为四个字符。

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

char不一定是整个Unicode 代码点 。 在诸如C#的UTF-16编码语言中,实际上可能需要2个char来表示单个“逻辑”字符。 你的字符串长度不符合你的期望 – String.Length Property的MSDN documnetation说:

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

  • 因此,如果您的Unicode字符仅在一个char编码,则它已经是数字(本质上是无符号的16位整数)。 您可能希望将其强制转换为某些整数类型,但这不会更改最初存在于char的实际位。
  • 如果您的Unicode字符是2个char ,则需要将其乘以2 ^ 16并将其添加到另一个,从而产生一个uint数值:

    char c1 = …;
    char c2 = …;
    uint c =((uint)c1 << 16)| C2;

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

当您说“十进制”时,这通常表示只包含人类将解释为十进制数字的字符的字符串。

  • 如果只能通过一个char表示Unicode字符,则可以通过以下方式将其转换为十进制字符串:

    char c =’அ’;
    string s =((ushort)c).ToString();

  • 如果您的Unicode字符有2个chars ,请将它们转换为如上所述的uint ,然后调用uint.ToString

—编辑—

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

顺便说一下,我认为你所谈论的正确名称不是“性格”而是“结合性格” 。 所以是的,单个组合字符可以有超过1个代码点,因此超过2个代码单元。 如果你想要一个十进制表示,比如组合字符,你可以通过BigInteger最容易地做到:

 string c = "\x0072\x0338\x0327\x0316\x0317\x0300\x0301\x0302\x0308\x0360"; string s = (new BigInteger(Encoding.Unicode.GetBytes(c))).ToString(); 

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

 char c = 'அ'; short code = (short)c; ushort code2 = (ushort)c;