繁体   English   中英

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

[英]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]);

其中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)'அ').ToString("X4")

X表示十六进制, 4表示零填充到四个字符。

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

char不一定是整个 Unicode代码点 在 UTF-16 编码的语言(例如 C#)中,您实际上可能需要 2 个char来表示单个“逻辑”字符。 并且您的字符串长度可能不是您所期望的 - String.Length 属性MSDN 文档说:

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM