【发布时间】:2010-08-04 08:39:00
【问题描述】:
有人知道在 Unicode 中查找与 ASCII 字符相似的字符的简单方法吗?例如“CYRILLIC SMALL LETTER DZE (ѕ)”。我想搜索并替换相似的字符。类似的意思是人类可读的。你看不出来有什么不同。
【问题讨论】:
标签: unicode ascii replace similarity fuzzy
有人知道在 Unicode 中查找与 ASCII 字符相似的字符的简单方法吗?例如“CYRILLIC SMALL LETTER DZE (ѕ)”。我想搜索并替换相似的字符。类似的意思是人类可读的。你看不出来有什么不同。
【问题讨论】:
标签: unicode ascii replace similarity fuzzy
正如其他评论者所指出的,Unicode normalisation(“兼容字符”)在这里对您没有帮助,因为您不是在寻找官方对等词,而是在寻找字形(字母形状)的相似性。 (不过,链接的 Unicode 技术报告仍然值得一读,因为它写得非常好。)
如果我是你,为了省去你自己组装字符列表的繁琐工作,我会在 homograph attacks 上搜索资源:这是一种通过显示包含域名的 URL 来恶意误导网络用户的方法一些字母已替换为视觉上相似的字母。另一个关于安全性的Unicode Technical Report 包含有关该问题的部分。还有——这可能是你最需要的——"confusables" table。这是另一篇以标点符号为主的文章,其中一些是 ASCII,在 non-ASCII code tables 中具有视觉上相似的对应物。
我希望你不是在问这个问题来构建这样的攻击。
【讨论】:
查看 Unicode 数据库:http://www.unicode.org/Public/UNIDATA/UnicodeData.txt。
每一行描述一个unicode字符,例如:
1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;;
如果该符号有任何相似(兼容)的字符,它将出现在条目的<compat> 字段中。在此示例中,0061 (ASCII a) 与 LATIN SMALL LETTER A WITH RIGHT HALF RING Unicode 字符兼容。
至于你的角色,条目是
0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405
如您所见,它没有指定兼容性字符。
【讨论】:
U+0061(字母“a”)后跟U+02BE(“右半环”修饰符)。对于来自不同字母的字符,存在兼容性序列是非常不寻常的——如果没有更多信息,这将使 OP 试图做的事情变得不可能。