MSDN article on String.Normalize州简单地说:
返回一个新字符串,其二进制表示形式为特定的Unicode规范化形式。
有时指的是“Unicode规范化形式C”。
我只是想知道,这是什么意思?这个功能在现实生活中如何有用?
答案 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)