7.0 有没有一种方法可以消除重音符号并将整个字符串转换为常规字母?| Java Debug 笔记

319 阅读1分钟

本文正在参加「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倍