[英]How do i get the decimal value of a unicode character in C#?
如何在 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]);
它与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)'அ').ToString("X4")
X
表示十六进制, 4
表示零填充到四个字符。
如何在 C# 中获取 unicode 字符的数值?
char
不一定是整个 Unicode代码点。 在 UTF-16 编码的语言(例如 C#)中,您实际上可能需要 2 个char
来表示单个“逻辑”字符。 并且您的字符串长度可能不是您所期望的 - String.Length 属性的MSDN 文档说:
“Length 属性返回此实例中 Char 对象的数量,而不是 Unicode 字符的数量。”
char
编码,则它已经是数字(本质上是一个无符号的 16 位整数)。 您可能希望将其转换为某些整数类型,但这不会更改char
中最初存在的实际位。 如果您的 Unicode 字符是 2 个char
,则需要将一个乘以 2^16 并将其与另一个相加,从而得到一个uint
数值:
字符 c1 = ...;
字符 c2 = ...;
uint c = ((uint)c1 << 16) | c2;
如何在 C# 中获取 unicode 字符的十进制值?
当你说“十进制”时,这通常意味着一个字符串,它只包含人类会解释为十进制数字的字符。
如果您只能用一个char
表示您的 Unicode 字符,您可以简单地将其转换为十进制字符串:
char c = 'அ';
字符串 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
。
这是使用平面 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
char c = 'அ';
short code = (short)c;
ushort code2 = (ushort)c;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.