在Java中将光学等效的Unicode字符串转换为ASCII?

4

我运营一个需要唯一unicode用户名的社交网络(正如预期的那样)。

一些有创意的用户开始使用Cyrillic(和其他)Unicode字符创建视觉上等价(但Unicode不同)的用户名。

例如,他们将使用Cyrillic小写字母a 'а',它看起来与罗马字母相同。

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


https://dev59.com/GnI95IYBdhLWcg3w5ic4#2097224 - user3020494
这可能取决于使用的字体。很棘手的问题。 - goat
所提及的答案并没有解决手头的问题。第一个答案只是删除变音符号并将剩余的非ASCII字符转换为“?”。关于Normalizer.Form.NFD的第二个答案根本不影响西里尔字母“a”。 - OnesAndZeroes
http://www.unicode.org/reports/tr39/#Confusable_Detection - ninjalj
2个回答

1
您可以尝试Unicode normalization - 基本上,无法区分的代码点会被指定为“规范”代码点,并且规范化是用规范形式替换每个字符的过程。
Java似乎通过java.text.Normalizer支持Unicode规范化 - 更多信息在这里
但是,我不确定拉丁字母A和西里尔字母A在Unicode中是否被标记为等效的 - 您需要尝试。
当用户开始使用非常相似而不是完全相同的字符时,这也无法帮助您 - 人类非常有创造力,技术解决方案可能无法100%工作,因此您可能仍然需要求助于人工审核。
还有其他一些解决方案 - 例如将用户名限制为拉丁文字母数字。

是的...我尝试了规范化的方法,看起来拉丁字母a和西里尔字母a并没有被标记为等效。看起来我可能只能手动构建一个转换表。真遗憾。 - OnesAndZeroes
@OnesAndZeroes 你预料到他们会是这样吗? - Andyz Smith

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

是的,甚至可以静态执行OCR并构建所需的翻译表,而不必在运行时进行OCR分析。 - Hot Licks
我曾考虑编写一些代码来比较字符之间的像素,但最终决定手动遍历Unicode表。其中西里尔字母、希腊字母和拉丁字母集似乎是最容易出问题的。最终结果还不错。 - OnesAndZeroes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接