c# - 将字符串转换为其代码点

标签 c# .net unicode astral-plane

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

是否有其他函数可用于将字符串转换为其代码点,或者我是否可以执行计算?

最佳答案

I have to convert a large amount of characters to their Unicode Code Point equivalents.

这似乎不是您实际要求的。如果你有来自 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 COMBINING BREVE 代替。)

关于c# - 将字符串转换为其代码点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17812427/

相关文章:

c# - Windows 8 中的密码库和凭据管理器有什么区别?

c# - 如何在 C# 中从 RGB (565) 值绘制 2D 图像

C# Ionic.Zip 进度条作为后台 worker

c# - 在 Azure SQL 数据库中插入/更新/删除新记录时将更新推送到 SignalR 流中

java - 如何替换java字符串中的unicode字符

c# - Extending LINQ to Nhibernate provider,结合Dynamic LINQ问题

c# - 工作 C# 示例 : Writing & Reading NTFS Alternate Data Stream Under Win7 64 bit

c# - 如何将 XML 文档注释添加到 Roslyn 中的 ClassDeclarationSyntax?

c++ - 用于 C/C++ 的小型开源 Unicode 库

javascript - String.normalize() 的意义何在?