西里尔文的Unicode比较'С';拉丁语';C';

西里尔文的Unicode比较'С';拉丁语';C';,unicode,normalization,collation,unicode-normalization,accent-insensitive,Unicode,Normalization,Collation,Unicode Normalization,Accent Insensitive,我有一个数据集,它混合使用unicode字符\u0421、'С'和\u0043、'C'。是否存在某种unicode比较,认为这两个字符相同?到目前为止,我已经尝试了几种ICU排序规则,包括俄文排序规则。当您查看时,您将看到一些代码位置被注释为使用中相似的代码点;然而,我不知道有任何广泛的列表涵盖了脚本之间的视觉相似性。您可能希望使用故意拼写错误搜索URL欺骗,这在他们提出punycode时已经讨论过。除此之外,最好的方法可能是使用正则表达式搜索数据中超出预期范围的字符,并编译一系列特殊的文本修复

我有一个数据集,它混合使用unicode字符\u0421、'С'和\u0043、'C'。是否存在某种unicode比较,认为这两个字符相同?到目前为止,我已经尝试了几种ICU排序规则,包括俄文排序规则。

当您查看时,您将看到一些代码位置被注释为使用中相似的代码点;然而,我不知道有任何广泛的列表涵盖了脚本之间的视觉相似性。您可能希望使用故意拼写错误搜索URL欺骗,这在他们提出punycode时已经讨论过。除此之外,最好的方法可能是使用正则表达式搜索数据中超出预期范围的字符,并编译一系列特殊的文本修复程序,如
text=text.replace/С/,“c”
,没有Unicode比较根据字形的视觉标识将字符视为相同。然而,Unicode技术标准#39涉及“易混淆”字符,即由于视觉识别或相似性而可能相互混淆的字符。它包括一个成对的数据文件,即“当使用协调字体设计时,任何特定字体的字形可能设计为形状相同的字符”,主要由成对的拉丁字母、西里尔字母或希腊字母组成,如C和С。您可能需要自己编写使用这些数据的代码,因为ICU似乎没有任何与易混淆概念相关的内容。

我认为运气不好,因为西里尔语C是拉丁语S。您可以制作一个字符集编码器/解码器。但是,为什么不使用一个处理
AaBCcEeHKMOoPpTUuXxYy
(大约)的
比较器呢。请注意,塞尔维亚人知道a
j
,白俄罗斯人知道a
i
。也许您可以使用Arial Unicode MS的字体标志符号,并导出一个视觉相似性表。请注意,对于UTF16,构建一个65K字符数组以从一个字符集转换到另一个字符集是很实际的。然而,深入研究UTF32,它变得太大而不实用。