代码之家  ›  专栏  ›  技术社区  ›  GeReV

.NET的string.normalize是做什么的?

  •  63
  • GeReV  · 技术社区  · 15 年前

    这个 MSDN article on String.Normalize 简单地说:

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

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

    我只是想知道,这是什么意思?这种功能在现实生活中是如何发挥作用的?

    4 回复  |  直到 7 年前
        1
  •  46
  •   Oded    15 年前

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

    来自Unicode标准 Annex #15 :

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

        2
  •  57
  •   Hans Kesting    7 年前

    形式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)
        }
    
        3
  •  6
  •   devio    15 年前

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

    Wikipedia 以越南语为例列出(u+1ebf)及其分解序列u+0065(e)u+0302(扬抑符重音)u+0301(锐音符)。

    string.normalize()在4种正常形式之间转换字符串可以用Unicode编码。

        4
  •  5
  •   Adam Houldsworth    15 年前

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

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

    据我推测,它可以用来比较两个Unicode字符串是否相等。