Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将光学等效的unicode字符串转换为ASCII?_Java_String_Transliteration - Fatal编程技术网

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

在Java中将光学等效的unicode字符串转换为ASCII?,java,string,transliteration,Java,String,Transliteration,我运行的社交网络要求unicode用户名是唯一的(正如预期的那样) 一些有创意的用户已经开始使用西里尔字母(和其他)unicode字符来创建光学上等价(但unicode不同)的用户名 例如,他们将使用西里尔文小写字母a‘а’,看起来与罗马字母相同 有人知道在Java中自动转换这些光学等效字符的方法吗?如果机制已经存在,我不希望手动创建转换表。您可以尝试-基本上,不可区分的代码点有一个指定的“规范”代码点,规范化是用其规范形式替换每个字符的过程 Java似乎通过Java.text.Normaliz

我运行的社交网络要求unicode用户名是唯一的(正如预期的那样)

一些有创意的用户已经开始使用西里尔字母(和其他)unicode字符来创建光学上等价(但unicode不同)的用户名

例如,他们将使用西里尔文小写字母a‘а’,看起来与罗马字母相同

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

您可以尝试-基本上,不可区分的代码点有一个指定的“规范”代码点,规范化是用其规范形式替换每个字符的过程

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

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

当你的用户开始使用非常相似的字符而不是完全相同的字符时,这对你也没有帮助——人类是非常有创造力的,技术解决方案在这里可能无法100%起作用,因此你可能不得不求助于人类的节制


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

为什么不尝试应用OCR库呢

这可能取决于所使用的字体。棘手的问题。参考答案不能解决手头的问题。第一个答案只是删除变音符号,并将剩余的非ASCII字符转换为“?”。关于Normalizer.Form.NFD的第二个答案根本不影响西里尔字母“a”。是的……我尝试了Normalizer方法,看起来拉丁语a和西里尔字母a没有被标记为等效。看起来我可能需要手工建立一个转换表。糟糕。@OnesAndZeroes你认为他们会是吗?是的,人们甚至可以静态地执行OCR并建立所需的翻译表,而不必动态地进行OCR分析。我考虑写一些东西来比较字符之间的像素,但决定只手工浏览unicode表。西里尔语、希腊语和拉丁语似乎有最多的罪犯。最后还不错。