.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 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

.net 技术都有哪些主流框架应用?

.net 有哪些常用框架?

.NET framework 和.NET有区别?啥区别?

.net core 3.0和.net5有什么区别

国内成熟的C#.NET快速开发框架都有哪些?

是否有 .NET(C# 或 VB.NET)的 UPnP 库? [关闭]