.NET的String.Normalize是做什么的?

关于String.Normalize的MSDN文章简单地说:

返回一个新的string,其二进制表示采用特定的Unicode规范化格式。

有时还提到“Unicode规范化表格C”。

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

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

从Unicode标准附件#15 :

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

formsC和formsD之间的一个区别是如何表示具有重音的字母:formsC使用单个重音字母代码点,而formsD将其分隔为字母和重音。

副作用是,这使得可以轻松地创build一个“删除口音”的方法。

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

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

维基百科列举了越南语ế(U + 1EBF)及其分解序列U + 0065(e)U + 0302(旋律重音)U + 0301(尖锐重音)。

string.Normalize()在4个正常forms之间转换,一个string可以用Unicode编码。

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

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

从我可以推测,它可以比较两个Unicodestring的平等。