将Java中的áéőűú更改为aeouu

50

1
重复:https://dev59.com/yHM_5IYBdhLWcg3wQQzw - Denis Tulskiy
请参见https://dev59.com/yHM_5IYBdhLWcg3wQQzw。 - softveda
问题已关闭,请提出新的问题。 - Sean Patrick Floyd
3个回答

152

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

因此答案也是一样的:

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}]", "")
);

输出:

这是一个奇特的字符串


1
幸运的是,我只需从以前的问题中复制粘贴它(包括第一段) :-) - Sean Patrick Floyd
1
好的,那么也许你应该再提出一个单独的问题,这次要说明你是在谈论Android。 - Sean Patrick Floyd
3
值得指出的是,Normalizer 类自 API 9 起已成为 Android SDK 的一部分。 - mradzinski
有趣的是,谷歌似乎总是更喜欢在搜索结果中显示重复内容。 - sorrymissjackson
这是一个很好的答案,但需要Java 6 :( - Deoxyseia
显示剩余3条评论

12
你可以使用java.text.Normalizer来将基本字母和变音符号分开,然后通过正则表达式删除后者:
public static String stripDiacriticas(String s) {
    return Normalizer.normalize(s, Form.NFD)
        .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}

1
我使用了类似的东西来完成任务:Pattern.compile("\p{InCombiningDiacriticalMarks}+").matcher(nfdNormalizedString).replaceAll(""); - Adriano

10

首先 - 不应该这么做。这些符号具有特殊的语音属性,不应该被忽略。

将它们转换的方法是创建一个包含每个配对的Map

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

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


9
+1 对于 你不应该 - Sean Patrick Floyd
2
@Andreas 确实,我猜那需要一个特定于区域设置的规范化函数(祝你好运:-))。 - Sean Patrick Floyd
3
有很多原因会让你这样做,比如说,如果你想将一个文件存储到磁盘上,但是文件名包含这些字符,NTFS(像大多数其他文件系统一样)是不允许的。 - Rainer
1
@Bozho 你确定吗?换句话说,你尝试了 Java 支持的所有文件系统上的每个可能的 Unicode 字符吗?我不会冒险... - Rainer
2
我认为我想要这个来对字符串集合进行排序。 - lacas
显示剩余4条评论

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