问题

问题是,如你所知,有数千个字符in the Unicode chart,我想将所有相似的字符转换为英文字母的字母。

例如,这里有一些转换:

ҥ->H
Ѷ->V
Ȳ->Y
Ǭ->O
Ƈ->C
tђє Ŧค๓เℓy --> the Family
...

我看到有超过20个版本的字母A / a。我不知道如何对它们进行分类。它们看起来像大海捞针。

unicode字符的完整列表是http://www.ssec.wisc.edu/~tomw/java/unicode.htmlhttp://unicode.org/charts/charindex.html。只需向下滚动即可看到字母的变化。

如何用Java转换所有这些?请帮帮我 :(


#1 热门回答(182 赞)

How do I remove diacritics (accents) from a string in .NET?重新发布我的帖子

这种方法在java中工作正常(纯粹是为了删除变音符号也称为重音符号)。

它基本上将所有重音字符转换为deAccented对应字符,然后将它们组合成变音符号。现在你可以使用正则表达式去除变音符号。

import java.text.Normalizer;
import java.util.regex.Pattern;

public String deAccent(String str) {
    String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD); 
    Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
    return pattern.matcher(nfdNormalizedString).replaceAll("");
}

#2 热门回答(69 赞)

它是版本的Apache Commons Lang的一部分。 3.0。

org.apache.commons.lang3.StringUtils.stripAccents("Añ");

returnsAn

另见http://www.drillio.com/en/software-development/java/removing-accents-diacritics-in-any-language/


#3 热门回答(19 赞)

试图"全部转换"是解决问题的错误方法。

首先,你需要了解你尝试做的事情的局限性。正如其他人所指出的,变音符号的存在是有原因的:它们本质上是该语言字母表中的独特字母,具有自己的意义/声音等。删除这些标记与替换英语单词中的随机字母相同。这是在你考虑使用西里尔语和其他基于脚本的文本(如阿拉伯语)之前,这些文本根本无法"转换"为英语。

如果你因为某种原因必须转换字符,那么接近它的唯一合理方法就是首先减少手头任务的范围。考虑输入的来源 - 如果你正在为"西方世界"编写应用程序(使用与任何语言一样好的短语),则你不太可能需要解析阿拉伯字符。类似地,Unicode字符集包含数百个数学和图形符号:用户没有(简单)方法直接输入这些符号,因此你可以假设它们可以被忽略。

通过采用这些逻辑步骤,你可以减少要解析的可能字符数,以便基于字典的查找/替换操作可行。然后它变成了一些创建字典的轻微无聊的工作,以及执行替换的一个微不足道的任务。如果你的语言支持本机Unicode字符(如Java所做)并正确优化静态结构,则此类查找和替换往往会非常快速。

这来自于为允许最终用户搜索包含变音字符的书目数据所需的应用程序的经验。查询数组(就像我们的情况一样)花了大约一个人的时间来制作,以涵盖所有西欧语言的所有变音符号。


原文链接