如何在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单位转换为数字值。
e.g。
String s = "அ";
int i = Unicode(s[0]);
答案 0 :(得分: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
如果您已将其作为字符串的一部分,请先获取该单个字符:
string text = GetText();
int x = text[2]; // Or whatever...
请注意,不在基本多语言平面中的字符将表示为两个UTF-16代码单元。 .NET中的 支持用于查找完整的Unicode代码点,但它不是简单。
答案 1 :(得分:7)
((int)'அ').ToString()
如果您将角色作为char
,则可以将其转换为int
,这将代表角色的数值。然后,您可以以任何您喜欢的方式打印出来,就像使用任何其他整数一样。
如果您想要十六进制输出,可以使用:
((int)'அ').ToString("X4")
X
用于十六进制,4
用于零填充到四个字符。
答案 2 :(得分:3)
如何在C#中获取unicode字符的数值?
char
不一定是整个Unicode code point。在诸如C#的UTF-16编码语言中,您实际上可能需要2 char
来表示单个“逻辑”字符。你的字符串长度不符合你的期望 - MSDN documnetation for String.Length Property说:
“Length属性返回此实例中的Char对象数,而不是Unicode字符数。”
char
中编码,则它已经是数字(本质上是无符号的16位整数)。您可能希望将转换为某些整数类型,但这不会更改char
中最初存在的实际位。如果您的Unicode字符为2 char
s,则需要将其乘以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代码单元。
BTW我认为你所谈论的正确名称不是“人物”,而是"combining character"。所以,是的,一个组合字符可以有超过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
。
答案 3 :(得分:1)
char c = 'அ';
short code = (short)c;
ushort code2 = (ushort)c;
答案 4 :(得分:1)
这是使用“平面1”(补充多语言平面(SMP))的示例:
string single_character = "\U00013000"; //first Egyptian ancient hieroglyph in hex
//it is encoded as 4 bytes (instead of 2)
//get the Unicode index using UTF32 (4 bytes fixed encoding)
Encoding enc = new UTF32Encoding(false, true, true);
byte[] b = enc.GetBytes(single_character);
Int32 code = BitConverter.ToInt32(b, 0); //in decimal