MSDN article on String.Normalize的声明很简单:
返回一个新字符串,该字符串的二进制表示形式为特定的Unicode规范化形式。
有时指的是"Unicode规范化形式C“。
我只是在想,这是什么意思?这个函数在现实生活中有什么用呢?
发布于 2010-07-20 16:22:35
它确保可以比较unicode字符串是否相等(即使它们使用不同的unicode编码)。
来自Unicode标准Annex #15
本质上,Unicode规范化算法将所有组合标记按指定顺序放置,并使用分解和组合规则将每个字符串转换为Unicode规范化形式之一。然后,对转换后的字符串进行二进制比较,以确定等价性。
发布于 2010-07-20 16:25:31
form C和form D之间的一个区别是带有重音的字母的表示方式: form C使用单个带有重音的字母代码点,而form 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
}
发布于 2010-07-20 16:33:15
在Unicode中,(合成的)字符可以具有唯一的代码点,也可以具有由基本字符及其重音符号组成的代码点序列。
Wikipedia列举了越南语重音(U+1EBF)及其分解序列U+0065 (e) U+0302 (扬音重音) U+0301 (急性重音)的例子。
string.Normalize()在4种范式之间进行转换,字符串可以用Unicode编码。
https://stackoverflow.com/questions/3288114
复制相似问题