【问题标题】:Unicode comparison of Cyrillic 'С' and Latin 'C'西里尔字母 'С' 和拉丁文 'C' 的 Unicode 比较
【发布时间】:2013-10-21 12:22:14
【问题描述】:

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

【问题讨论】:

  • 运气不好,因为西里尔字母 C 是拉丁字母 S。你可以制作一个 CharsetEncoder/Decoder。但是,为什么不使用Comparator<String> 来处理AaBCcEeHKMOoPpTUuXxYy(或左右)。请注意,塞尔维亚人知道j,白俄罗斯人知道i。也许您可以使用 Arial Unicode MS 的字体字形并导出视觉相似度表。
  • 请注意,对于 UTF16,构建一个 65K 字符数组来从一个字符集转换为另一个字符集是很实用的。但是,对 UTF32 进行了深入研究,它变得太大而无法实用。

标签: unicode normalization collation unicode-normalization accent-insensitive


【解决方案1】:

没有 Unicode 比较可以根据字形的视觉识别将字符视为相同。然而,Unicode 技术标准#39,Unicode Security Mechanisms,处理“易混淆”——由于视觉识别或相似性而可能相互混淆的字符。它包括一个confusables“intentionally confusable” 对的数据文件,即“在使用协调字体设计时,任何特定字体中的字形可能被设计成形状相同的字符”,主要由拉丁文对组成和西里尔字母或希腊字母,如 C 和 С。您可能需要编写自己使用这些数据的代码,因为 ICU 似乎没有与易混淆概念相关的任何内容。

【讨论】:

    【解决方案2】:

    当您查看http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt 时,您会看到一些 代码位置被注释为使用相似的代码点;但是,我不知道有任何涵盖跨脚本视觉相似性的广泛列表。您可能希望使用故意拼写错误来搜索 URL 欺骗,这在他们提出 punycode 时进行了讨论。除此之外,您最好的选择可能是使用正则表达式在数据中搜索超出预期的字符,并编译一系列临时文本修复程序,例如text = text.replace /с/, 'c'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-19
      • 2017-01-01
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多