3

我必须将大量字符转换为它们的 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)不起作用,因为这需要更高代码点的字符。

是否有另一个函数可以用来将字符串转换为它们的代码点,或者我可以执行一个计算?

4

1 回答 1

7

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

这似乎不是你真正想要的。如果您有来自基本多语言平面(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);

这将打印“U+01CE”,即带有 CARON 的拉丁小写字母 A,这似乎是您想要的。(U+030C 是COMBINING CARON,所以结果是 U+01CE LATIN SMALL LETTER A WITH CARON。如果你真的想要 U+0103 LATIN SMALL LETTER A WITH BREVE,你需要使用 U+0306 COMBINING BREVE代替。)

于 2013-07-23T08:43:05.480 回答