.NET的String.Normalize做什么?

GeR*_*ReV 70 .net string

关于String.NormalizeMSDN文章简单说明:

返回一个新字符串,其二进制表示形式为特定的Unicode规范化形式.

有时也会提到"Unicode规范化形式C".

我只是想知道,这是什么意思?这个功能在现实生活中有用吗?

Han*_*ing 65

表单C和表单D之间的一个区别是如何表示带有重音符号的字母:表单C使用带有重音符号的单个字母,而表单D将其分隔为字母和重音符号.

例如,"à"可以是代码点224("带有严重的拉丁文小写字母A"),或代码点97("拉丁文小写字母A"),后跟代码点786("组合严重重音").

副作用是这使得可以容易地创建"移除重音"方法.

    public static string RemoveAccents(string input)
    {
        return new string(
            input
            .Normalize(System.Text.NormalizationForm.FormD)
            .ToCharArray()
            .Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
            .ToArray());
        // the normalization to FormD splits accented letters in accents+letters
        // the rest removes those accents (and other non-spacing characters)
    }
Run Code Online (Sandbox Code Playgroud)

  • 在“RemoveAccents”方法中,您实际上并不需要“.ToCharArray()”,因为“string”类本身就是“IEnumerable<char>”(您也可以在“Rot13”方法中利用它)。 (2认同)

Ode*_*ded 50

它确保可以比较unicode字符串的相等性(即使它们使用不同的unicode编码).

来自Unicode标准附件#15:

本质上,Unicode规范化算法以指定的顺序放置所有组合标记,并使用分解和组合规则将每个字符串转换为Unicode规范化表单之一.然后,变换后的字符串的二进制比较将确定等价性.


dev*_*vio 6

在Unicode中,(组合)字符可以具有唯一的代码点,也可以是由基本字符及其重音组成的代码点序列.

维基百科列举例如越南语U(U + 1EBF)及其分解序列U + 0065(e)U + 0302(抑扬音)U + 0301(急性重音).

string.Normalize()在4个普通形式之间进行转换,字符串可以用Unicode编码.


Ada*_*rth 5

这个链接有一个很好的解释:

http://unicode.org/reports/tr15/#Norm_Forms

从我可以推测的,它可以比较两个unicode字符串的相等性.