将字符串转换为它们的代码点

本文关键字:代码 字符串 转换 | 更新日期: 2023-09-27 18:24:29

我必须将大量字符转换为等效的Unicode代码点。我使用以下代码进行转换:

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

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

有没有其他函数可以用来将字符串转换为它们的代码点,或者我可以执行的计算?

将字符串转换为它们的代码点

我必须将大量的字符转换为它们的Unicode代码点等价物。

这似乎并不是你真正想要的。如果您有来自基本多语言平面(BMP)的字符,则每个char恰好对应一个代码点。转换为UTF-32不会改变这一点。

ConvertToUtf32()方法,尤其是需要两个char的重载,用于处理不来自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);

这将打印"U+01CE",这是拉丁语小写字母A和CARON,这似乎是你想要的。(U+030C是组合CARON,所以结果是U+01CE拉丁小写字母A与CARON。如果你真的想要U+0103拉丁小写字母A与BREVE,你需要使用U+0306组合BREVE。)