如何在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;