将字符串转换为其代码点

时间:2013-07-23 07:43:04

标签: c# .net unicode astral-plane

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

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)不起作用,因为它需要更高代码点的字符。

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

1 个答案:

答案 0 :(得分:7)

  

我必须将大量字符转换为其Unicode代码点等效字符。

这似乎不是你真正要求的。如果您有Basic Multilingual Plane(BMP)中的字符,则每个char只对应一个代码点。转换为UTF-32不会改变任何相关内容。

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

您实际上要求的是将normalize字符串转换为“规范化形式规范组合”(NFC)。为此,请使用the string.Normalize() method

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

这将打印“U + 01CE”,即LATIN SMALL LETTER A WITH CARON,这似乎是你想要的。 (U + 030C是COMBINING CARON,所以结果是U + 01CE LATIN SMALL LETTER A WITH CARON。如果你真的想要U + 0103 LATIN SMALL LETTER A WITH BREVE,你需要使用U + 0306 {{3}而不是。)