.NET 的 String.Normalize 有啥作用?
Posted
技术标签:
【中文标题】.NET 的 String.Normalize 有啥作用?【英文标题】:What does .NET's String.Normalize do?.NET 的 String.Normalize 有什么作用? 【发布时间】:2010-07-20 08:17:59 【问题描述】:MSDN article on String.Normalize 简单地说:
返回一个新字符串,其二进制表示形式为特定的 Unicode 规范化形式。
有时指的是“Unicode 规范化形式 C”。
我只是想知道,这是什么意思?这个函数在现实生活中有何用处?
【问题讨论】:
+1 好问题,我自己也很好奇。 【参考方案1】:表格 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
【讨论】:
【参考方案2】:它确保可以比较 unicode 字符串是否相等(即使它们使用不同的 unicode 编码)。
来自 Unicode 标准 Annex #15:
本质上,Unicode 规范化算法将所有组合标记按指定顺序放置,并使用分解和组合规则将每个字符串转换为一种 Unicode 规范化形式。然后对转换后的字符串进行二进制比较来确定等价性。
【讨论】:
优秀的答案。提供的链接很棒!【参考方案3】:在 Unicode 中,(组合)字符可以有一个唯一的代码点,也可以是由基本字符及其重音符号组成的代码点序列。
Wikipedia 列举越南语ế (U+1EBF) 及其分解序列 U+0065 (e) U+0302(抑扬符)U+0301(锐音)作为示例。
string.Normalize() 在 4 种范式之间转换一个字符串可以用 Unicode 编码。
【讨论】:
【参考方案4】:这个链接有很好的解释:
http://unicode.org/reports/tr15/#Norm_Forms
据我推测,这样您就可以比较两个 unicode 字符串是否相等。
【讨论】:
以上是关于.NET 的 String.Normalize 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章