.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编码。