【发布时间】:2010-07-20 08:17:59
【问题描述】:
MSDN article on String.Normalize 简单地说:
返回一个新字符串,其二进制表示形式为特定的 Unicode 规范化形式。
有时指的是“Unicode 规范化形式 C”。
我只是想知道,这是什么意思?这个函数在现实生活中有何用处?
【问题讨论】:
-
+1 好问题,我自己也很好奇。
MSDN article on String.Normalize 简单地说:
返回一个新字符串,其二进制表示形式为特定的 Unicode 规范化形式。
有时指的是“Unicode 规范化形式 C”。
我只是想知道,这是什么意思?这个函数在现实生活中有何用处?
【问题讨论】:
表格 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
}
【讨论】:
它确保可以比较 unicode 字符串是否相等(即使它们使用不同的 unicode 编码)。
来自 Unicode 标准 Annex #15:
本质上,Unicode 规范化算法将所有组合标记按指定顺序放置,并使用分解和组合规则将每个字符串转换为一种 Unicode 规范化形式。然后对转换后的字符串进行二进制比较来确定等价性。
【讨论】:
在 Unicode 中,(组合)字符可以有一个唯一的代码点,也可以是由基本字符及其重音符号组成的代码点序列。
Wikipedia 列举越南语ế (U+1EBF) 及其分解序列 U+0065 (e) U+0302(抑扬符)U+0301(锐音)作为示例。
string.Normalize() 在 4 种范式之间转换一个字符串可以用 Unicode 编码。
【讨论】:
【讨论】: