有没有办法摆脱重音并将其整个字符串转换为常规字母?

2022-08-31 05:07:49

有没有更好的方法来摆脱口音并使这些字母成为规则,除了使用方法和逐个替换字母之外?例: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}", "");

对于 unicode,匹配基本字形和(小写)匹配每个重音符号。\\P{M}\\p{M}

感谢GarretWilson的指针和 regular-expressions.info 伟大的Unicode指南。


答案 2

截至2011年,您可以使用Apache Commons StringUtils.stripAccents(input)(自3.0起):

    String input = StringUtils.stripAccents("Tĥïŝ ĩš â fůňķŷ Šťŕĭńġ");
    System.out.println(input);
    // Prints "This is a funky String"

注意:

被接受的答案(Erick Robertson的)不适用于Ø或Ł.Apache Commons 3.5也不适用于Ø,但它确实适用于Ł。在阅读了维基百科上关于Ø的文章后,我不确定它是否应该替换为“O”:它是挪威语和丹麦语中的一个单独的字母,在“z”之后按字母顺序排列。这是“条形口音”方法局限性的一个很好的例子。