本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:有没有一种方法可以消除重音符号并将整个字符串转换为常规字母?
惊了!还有这种字符?但我估计就是ascii减去常数
除了使用String.replaceAll()方法和逐个替换字母以外,还有没有更好的方法来消除重音并使这些字母规则化?例子:
输入: orčpžsíáýd
输出: orcpzsiayd
回答1:
你可以使用java.text.Normalizer来处理这个。
string = Normalizer.normalize(string, Normalizer.Form.NFD);
// or Normalizer.Form.NFKD for a more "compatible" deconstruction
这会将所有重音符号与字符分开。然后,您只需要将每个字符与一个字母进行比较,然后将不存在的字符扔掉即可
string = string.replaceAll("[^\\p{ASCII}]", "");
// 如果您的文本使用unicode,则应改用以下代码:
string = string.replaceAll("\\p{M}", "");
回答2:
您可以使用Apache Commons StringUtils.stripAccents(input)
从2011年开始,您可以使用Apache Commons StringUtils.stripAccents(input)(从3.0开始):
String input = StringUtils.stripAccents("Tĥïŝ ĩš â fůňķŷ Šťŕĭńġ");
System.out.println(input);
// Prints "This is a funky String"
ps:Apache Commons 3.5也不适用于Ø,但适用于Ł。
回答3:
删除所有非ASCII字符可以不用正则表达式来完成:
import java.text.Normalizer;
public class Strip {
public static String flattenToAscii(String string) {
StringBuilder sb = new StringBuilder(string.length());
string = Normalizer.normalize(string, Normalizer.Form.NFD);
for (char c : string.toCharArray()) {
if (c <= '\u007F') sb.append(c);
}
return sb.toString();
}
}
可以通过写入char []而不调用toCharArray()来获得小的额外加速,尽管我不确定代码清晰度的降低是否值得:
public static String flattenToAscii(String string) {
char[] out = new char[string.length()];
string = Normalizer.normalize(string, Normalizer.Form.NFD);
int j = 0;
for (int i = 0, n = string.length(); i < n; ++i) {
char c = string.charAt(i);
if (c <= '\u007F') out[j++] = c;
}
return new String(out);
}
这种变化的优点是使用Normalizer的正确性和使用表的高效。在我的机器上,这个速度比接受的答案快4倍