C#的Normalize(System.Text.NormalizationForm normalizationForm)

最近工作上遇到一个问题,发现原数据里面的罗马数字Ⅰ和Ⅱ,会分别被转为大写英文字母I和II,查到是因为调用了下面这个方法

value = "パインブリッジ新成長国債券マザーファンドⅠ"

value = value.Normalize(NormalizationForm.FormKC);

Normalize的参数选择NormalizationForm.FormKC时,value的值就会变成"パインブリッジ新成長国債券マザーファンドI"

百度一下发现Normalize方法是将字符串规范化为指定的范式,共有四个参数,不加参数则默认是FormC

FormC 1

指示 Unicode 字符串使用完全标准分解进行规范化,然后将序列替换为其主复合(如果可能)。

FormD 2

指示 Unicode 字符串使用完全标准分解进行规范化。

FormKC 5

指示 Unicode 字符串使用完全兼容分解进行规范化,然后将序列替换为其主复合(如果可能)。

FormKD 6

指示 Unicode 字符串使用完全兼容分解进行规范化。

当需要一个唯一的分解或者组合表达时,Unicode文本可以采用一个规范化的格式来消除不必要的区别。Unicode的标准定义了了四种规范化形式:规范化形式D(NFD),规范化形式C(NFC),规范化形式KD(NFKD),规范化形式KC(NFKC)。NFD和NFKD在可能的情况下分解字符,而NFC和NFKC在可能的情况下组成字符。这四种格式的转换则依赖于Unicode定义了规范分解的映射表和兼容分解映射表。

规范化分解过程将一个字符串递归的用规范分解映射表中的对应字符进行替换,并组合规范序列以进行最后表示的过程,这个分解过程对于语义是一个无损转换。

兼容性分解过程将一个字符串递归的用兼容分解映射表或者规范分解映射表的字符进行替换,并组合规范组合序列以进行最后表示的过程。由于兼容分解映射表是有损的,这个过程会丢失部分语义,所以兼容性分解需要谨慎进行。

四种范式的具体定义如下所示:

NFD:规范化分解

NFKD:兼容性分解

NFC:规范化分解后再规范化组合

NFKC:兼容性分解后再规范化组合

把参数NormalizationForm.FormKC改成NormalizationForm.FormC或者去掉参数就解决了上面的问题,附上参考文档:NormalizationForm 枚举 (System.Text) | Microsoft Learn

 

posted @ 2023-01-06 19:21  微时空  阅读(265)  评论(0编辑  收藏  举报