.NET的String.Normalize有什么作用?


75

有关String.NormalizeMSDN文章仅指出:

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

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

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


2
+1个好问题,对此感到好奇。
亚当·霍兹沃思

Answers:


52

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

从Unicode标准附件#15中

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


极好的答案。提供的链接很棒!
GeReV

73

表单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 letters+accents
    // the rest removes those accents (and other non-spacing characters)
    // and creates a new string from the remaining chars
}

6

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

维基百科举例列出了越南语+1(U + 1EBF)及其分解序列U + 0065(e)U + 0302(抑扬音)和U + 0301(急性口音)。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.