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

时间:2011-10-19 18:24:47

标签: c# string unicode localization

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

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

另见

多个代码点字符

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

  • enter image description here(即U+0072 U+0327 U+030C
  • enter image description here(即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]);

Where Unicode returns the integer value, as defined by the Unicode standard, for the first character of the input expression.

5 个答案:

答案 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字符数。”

  • 因此,如果您的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