【发布时间】:2019-09-13 05:06:37
【问题描述】:
我正在编写一个程序,需要我将 Unicode 文本转换为其对应的 Unicode 值。就像您将字母“a”转换为 ASCII 表中的数字(十进制为 97)时所做的那样。只有我想知道这是否可以在 Unicode 中完成。
提前致谢。
【问题讨论】:
-
也许他需要
Char.ConvertToUtf32?
我正在编写一个程序,需要我将 Unicode 文本转换为其对应的 Unicode 值。就像您将字母“a”转换为 ASCII 表中的数字(十进制为 97)时所做的那样。只有我想知道这是否可以在 Unicode 中完成。
提前致谢。
【问题讨论】:
Char.ConvertToUtf32?
.NET 没有用于迭代字母或字符代码的内置方法,因为它们位于 .NET 使用的字符编码 (UTF-16) 和字形 ("user - 感知字符”)。
UTF-16 将每个 Unicode 代码点编码为一个或两个代码单元(.NET 的 Char,在 C# 中别名为 char)。 String(在 C# 中别名为 string)是 UTF-16 代码单元的计数序列。
Char 结构确实有一些处理代码点的方法(如Int32)和一些有助于迭代代码点的笨拙方法。注意:代码点通常以 U+ 前缀和 4 或 5 个十六进制数字编写。
StringInfo 类有一些迭代字素(又名“文本元素”)的方法。
但是,由于您询问 Unicode 字符代码(“代码点”),UnicodeInformation NuGet 包可能是最佳选择。
通过它,您还可以获得Unicode.org 发布的每个代码点的描述。他们的网站有很多信息,包括codepoints 的完整列表。
var s = "Put your ? repair hobby on your résumé.";
// ? takes two UTF-16 code units.
// Second é is two codepoints: "e\u0301", base and combining codepoints
var e = StringInfo.GetTextElementEnumerator(s);
while (e.MoveNext())
{
var grapheme = (String)e.Current;
Console.WriteLine(grapheme);
foreach (var codepoint in grapheme.AsCodePointEnumerable())
{
var info = UnicodeInfo.GetCharInfo(codepoint);
Console.WriteLine($" U+{codepoint:X04} {info.Name} {info.Category}");
}
}
另外,如果您不知道,UTF-16(或其向前兼容的前身 UCS-2)在许多环境中已成为原生字符编码大约 25 年:VB4/5/6/A/Script, Java、JavaScript、Windows API、NTFS、SQL NCHAR 和 NVARCAR,……
【讨论】:
试试这个:
string text = "€ a+…”";
foreach (char c in text)
{
Console.WriteLine("{0} U+{1:x4} {2}", c, (int)c, (int)c);
}
对于字符串中的每个字符显示:
【讨论】: