【问题标题】:Converting plain text into its corrosponding Unicode value?将纯文本转换为其对应的 Unicode 值?
【发布时间】:2019-09-13 05:06:37
【问题描述】:

我正在编写一个程序,需要我将 Unicode 文本转换为其对应的 Unicode 值。就像您将字母“a”转换为 ASCII 表中的数字(十进制为 97)时所做的那样。只有我想知道这是否可以在 Unicode 中完成。

提前致谢。

【问题讨论】:

标签: c# unicode


【解决方案1】:

.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,……

【讨论】:

    【解决方案2】:

    试试这个:

    string text = "€ a+…”";
    foreach (char c in text)
    {
        Console.WriteLine("{0} U+{1:x4} {2}", c, (int)c, (int)c);
    }
    

    对于字符串中的每个字符显示:

    • 角色
    • 它是十六进制的 unicode 字符代码
    • 是 unicode 字符代码号

    【讨论】:

    • 也不适用于 NFD 或 NKFD 序列。但这是 OP 的意图吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2018-05-28
    • 2012-04-12
    相关资源
    最近更新 更多