题 Java改变áéőűú到aeouu [复制]


可能重复:
从Unicode字符中删除变音符号(ǹṅṅņṇṋṉ̈ƞᶇᶇȵ)
有没有办法摆脱重音并将整个字符串转换为普通字母? 

我怎样才能做到这一点?谢谢您的帮助


33
2017-11-08 08:10


起源


重复: stackoverflow.com/questions/1453171/... - Denis Tulskiy
看到 stackoverflow.com/questions/1453171/... - softveda
@Greg这是一个.net问题 - Sean Patrick Floyd
在android中请 - lacas
问题已经结束,问一个新问题 - Sean Patrick Floyd


答案:


我认为你的问题与以下相同:

因此答案也是一样的:

String convertedString = 
       Normalizer
           .normalize(input, Normalizer.Form.NFD)
           .replaceAll("[^\\p{ASCII}]", "");

看到

示例代码:

final String input = "Tĥïŝ ĩš â fůňķŷ Šťŕĭńġ";
System.out.println(
    Normalizer
        .normalize(input, Normalizer.Form.NFD)
        .replaceAll("[^\\p{ASCII}]", "")
);

输出:

这是一个时髦的字符串


100
2017-11-08 08:17



+1,很棒的答案。 - aioobe
幸运的是,我只需要复制并粘贴上一个问题(包括第一段):-) - Sean Patrick Floyd
对不起,但它在Android中,不仅是java,normalizer类不在android系统中 - lacas
好的,那么也许你应该在一个单独的问题中再问一遍,这次提到你在谈论android。 - Sean Patrick Floyd
我认为值得指出的是 正规化 class是自API 9以来Android SDK的一部分。 - mradzinski


您可以使用 java.text.Normalizer 分隔基本字母和变音符号,然后通过正则表达式删除后者:

public static String stripDiacriticas(String s) {
    return Normalizer.normalize(s, Form.NFD)
        .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}

11
2017-11-08 08:15



我使用了类似的东西:Pattern.compile(“\\ p {InCombiningDiacriticalMarks} +”)。matcher(nfdNormalizedString).replaceAll(“”); - Adrien Be


首先 - 你不应该。这些符号具有特殊的语音特性,不应忽视。

转换它们的方法是创建一个 Map 持有每一对:

Map<Character, Character> map = new HashMap<Character, Character>();
map.put('á', 'a');
map.put('é', 'e');
//etc..

然后循环字符串中的字符,通过调用创建一个新字符串 map.get(currentChar)


8
2017-11-08 08:12



+1为 你不应该 - Sean Patrick Floyd
另一个+1 不能。在德语中替换'ä'将是“ae”(惊喜:两个字符......)并且我打赌其他语言​​有更多的例子。 - Andreas_D
@Andreas是的,我想这会要求一个特定于语言环境的Normalizer函数(祝你好运:-))。 - Sean Patrick Floyd
你有这么多理由。例如如果你想在光盘上存储文件,但文件名包含这些字符。 NTFS(和大多数其他FS一样)不允许这样做。 - Rainer
@Bozho你确定吗?或者换句话说,您是否尝试过java支持的所有文件系统上的每个可能的unicode字符?我不会冒风险...... - Rainer