【问题标题】:Convert optically equivalent unicode strings to ASCII in Java?在Java中将光学等效的unicode字符串转换为ASCII?
【发布时间】:2013-11-24 02:05:36
【问题描述】:

我经营一个社交网络,要求 unicode 用户名是唯一的(如预期的那样)。

一些有创意的用户已经开始使用西里尔文(和其他)unicode 字符来创建视觉上等效(但 unicode 不同)的用户名。

例如,他们将使用西里尔小写字母“а”,看起来与罗马字母相同。

有谁知道在 Java 中自动转换这些光学等效字符的方法?如果机制已经存在,我宁愿不必手动创建转换表。

【问题讨论】:

标签: java string transliteration


【解决方案1】:

您可以尝试Unicode normalization - 基本上,无法区分的代码点指定了一个“规范”代码点,规范化是将每个字符替换为其规范形式的过程。

Java 似乎通过 java.text.Normalizer 支持 Unicode 规范化 - 更多信息 here

但是,我不确定拉丁语 A 和西里尔字母 A 在 Unicode 中是否被标记为等效 - 您必须尝试一下。

当您的用户开始使用 非常相似 而不是 相同 字符时,这也对您没有帮助 - 人类非常有创造力,技术解决方案可能无法 100% 发挥作用,所以无论如何你可能不得不求助于人类的节制。

还有一些其他解决方案 - 例如,将用户名限制为拉丁字母数字。

【讨论】:

  • 是的...我尝试了 Normalizer 方法,看起来拉丁语 a 和西里尔语 a 没有被标记为等效。看起来我可能只需要手动构建一个转换表。无赖。
  • @OnesAndZeroes 你预计他们会是吗?
【解决方案2】:

您为什么不尝试应用 OCR 库。

【讨论】:

  • 是的,甚至可以静态执行 OCR 并建立所需的翻译表,而不必动态进行 OCR 分析。
  • 我考虑写一些东西来比较字符之间的像素,但决定只手动浏览 unicode 表。西里尔文、希腊文和拉丁文集似乎有最多的违规者。最后还不错。
猜你喜欢
  • 2013-01-26
  • 2010-09-13
  • 2018-03-21
  • 2011-07-05
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多