.NET的String.Normalize做什么?

时间:2010-07-20 08:17:59

标签: .net string

MSDN article on String.Normalize州简单地说:

  

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

有时指的是“Unicode规范化形式C”。

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

4 个答案:

答案 0 :(得分:60)

表单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)
    }

答案 1 :(得分:49)

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

来自Unicode标准Annex #15

  

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

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:5)

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

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

据我所知,它可以比较两个unicode字符串的相等性。