有没有办法摆脱重音并将其整个字符串转换为常规字母?
2022-08-31 05:07:49
有没有更好的方法来摆脱口音并使这些字母成为规则,除了使用方法和逐个替换字母之外?例:String.replaceAll()
输入:orčpžsíáýd
输出:orcpzsiayd
它不需要包括所有带有重音符号的字母,如俄语字母表或中文字母表。
有没有更好的方法来摆脱口音并使这些字母成为规则,除了使用方法和逐个替换字母之外?例:String.replaceAll()
输入:orčpžsíáýd
输出:orcpzsiayd
它不需要包括所有带有重音符号的字母,如俄语字母表或中文字母表。
使用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指南。
截至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”之后按字母顺序排列。这是“条形口音”方法局限性的一个很好的例子。