【问题标题】:Find similar ASCII character in Unicode在 Unicode 中查找相似的 ASCII 字符
【发布时间】:2010-08-04 08:39:00
【问题描述】:

有人知道在 Unicode 中查找与 ASCII 字符相似的字符的简单方法吗?例如“CYRILLIC SMALL LETTER DZE (ѕ)”。我想搜索并替换相似的字符。类似的意思是人类可读的。你看不出来有什么不同。

【问题讨论】:

    标签: unicode ascii replace similarity fuzzy


    【解决方案1】:

    正如其他评论者所指出的,Unicode normalisation(“兼容字符”)在这里对您没有帮助,因为您不是在寻找官方对等词,而是在寻找字形(字母形状)的相似性。 (不过,链接的 Unicode 技术报告仍然值得一读,因为它写得非常好。)

    如果我是你,为了省去你自己组装字符列表的繁琐工作,我会在 homograph attacks 上搜索资源:这是一种通过显示包含域名的 URL 来恶意误导网络用户的方法一些字母已替换为视觉上相似的字母。另一个关于安全性的Unicode Technical Report 包含有关该问题的部分。还有——这可能是你最需要的——"confusables" table。这是另一篇以标点符号为主的文章,其中一些是 ASCII,在 non-ASCII code tables 中具有视觉上相似的对应物。

    我希望你不是在问这个问题来构建这样的攻击。

    【讨论】:

    • 感谢所有好的链接和解释。我实际上试图防止此类攻击。 :-) 而且我想我会找到更多关于关键字“homograph attack”的东西。
    • 很高兴听到:)。是的,这就是您需要的关键字!我编辑了一个链接(它指向一个过时的版本)。
    • 合法用途:对于国际化测试,我有一个工具可以使用外观相似的字符生成假外语文本。说英语的测试人员可以阅读“外国”文本,但他们也可以清楚地分辨出它不是硬编码的英语。尽管如果 unicode 字符非常相似以至于您无法区分,则它不起作用。我主要做的事情是给元音添加重音符号。
    • 我正在使用它来制作一个 ircbot,如果它在频道中提到某人,它不会突出显示任何人 :)
    【解决方案2】:

    查看 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;;;;;
    

    如果该符号有任何相似(兼容)的字符,它将出现在条目的&lt;compat&gt; 字段中。在此示例中,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 试图做的事情变得不可能。
    • OP 声明“类似于 ASCII 字符”,并不准确。如果您正在寻找带有右半环的“a”,如果没有其他可用的,您可以选择 ASCII 的“a”。
    • 同意——在这种情况下。但是,如果您正在寻找类似于西里尔文 ѕ 的 ASCII 字符,这是 OP 使用的示例,那将不起作用。
    • @cHao:你说得对——正如我在回答中所说,对于 OP 请求的特定字符,兼容性字符不是一个有用的方法。
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 2023-03-16
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多