将字符串转换为其代码点

use*_*462 3 .net c# unicode astral-plane

我必须将大量字符转换为它们的Unicode Code Point等价物.我使用以下代码进行此转换:

string sample = "b";
int utf32 = char.ConvertToUtf32(sample, 0);
string codePoint = string.Format("{0:X}", utf32);
Run Code Online (Sandbox Code Playgroud)

这适用于更普通的字符,但后来我有这样的字符,a?其中实际字符串包含2个字符a (U-0061)'?' (U-030C).ConverToUtf32(string, int)那里的函数只返回我实际期待的第一个(或另一个取决于索引)字符U-0103.使用ConvertToUtf32(char, char)不起作用,因为它需要更高代码点的字符.

我可以使用另一个函数将字符串转换为代码点,还是可以执行的计算?

svi*_*ick 7

我必须将大量字符转换为它们的Unicode Code Point等价物.

这似乎不是你真正要求的.如果您有基本多语言平面(BMP)中的字符,则每个字符char对应于一个代码点.转换为UTF-32不会改变任何相关内容.

ConvertToUtf32()方法,尤其是需要两个chars 的重载用于处理非BMP的代码点.但这似乎并不是你所需要的.

你真正似乎要求是标准化串入"规范化表标准合成"(NFC).为此,请使用以下string.Normalize()方法:

string decomposed = "\x0061\x030C";
string composed = decomposed.Normalize(NormalizationForm.FormC);
foreach (char c in composed)
    Console.WriteLine("U+{0:X4}", (int)c);
Run Code Online (Sandbox Code Playgroud)

这将打印"U + 01CE",这是LATIN SMALL LETTER A WITH CARON,这似乎是你想要的.(U + 030C是COMBINING CARON,所以结果是U + 01CE LATIN小写字母带有卡通.如果你真的想要U + 0103 LATIN小写字母A带有BREVE,你需要使用U + 0306 COMBINING BREVE.)