从Unicode字符串中删除重音的简便方法?

Rob*_*Rob 65 java string unicode diacritics

我想改变这句话:

Etçaserasamoitié.

至 :

Et ca sera sa moitie.

有没有一种简单的方法在Java中执行此操作,就像我在Objective-C中所做的那样?

NSString *str = @"Et ça sera sa moitié.";
NSData *data = [str dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *newStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 135

最后,我通过使用Normalizer该类解决了它.

import java.text.Normalizer;

public static String stripAccents(String s) 
{
    s = Normalizer.normalize(s, Normalizer.Form.NFD);
    s = s.replaceAll("[\\p{InCombiningDiacriticalMarks}]", "");
    return s;
}
Run Code Online (Sandbox Code Playgroud)

  • 为了正确转换一些字符串,我使用了**`Form.NFKD`**(“兼容性分解。”) (3认同)
  • @ykatchou您指的是“com.ibm.icu.text.Normalizer”,但答案是关于“java.text.Normalizer” (2认同)

Ond*_*zek 80

也许最简单,最安全的方法是使用StringUtils阿帕奇共享郎

StringUtils.stripAccents(String input)
Run Code Online (Sandbox Code Playgroud)

从字符串中删除变音符号(〜=重音符号).案件不会改变.例如,'à'将替换为'a'.请注意,连字将保持原样.

StringUtils的.stripAccents()

  • 请注意,它是Apache Commons Lang3,而不是Commons Lang (4认同)
  • 选定的答案不会从字符串中消除波兰语 `ł` 和 `Ł`,这个答案会。 (3认同)

Epi*_*rce 8

我想唯一的区别是我使用的是a +而不是[]与解决方案相比.我认为两者都有效,但最好也可以在这里使用.

String normalized = Normalizer.normalize(input, Normalizer.Form.NFD);
String accentRemoved = normalized.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
Run Code Online (Sandbox Code Playgroud)


Tri*_*ard 6

对于科特林

fun stripAccents(s: String): String 
{
    var string = Normalizer.normalize(s, Normalizer.Form.NFD)
    string = Regex("\\p{InCombiningDiacriticalMarks}+").replace(string, "")
    return  string
}
Run Code Online (Sandbox Code Playgroud)

  • 很好,但是如果有 String 的扩展函数会更好 (2认同)

her*_*ung 5

假设您使用的是Java 6或更高版本,您可能需要查看Normalizer可以分解重音的内容,然后使用正则表达式去除组合重音.

否则,您应该能够使用相同的结果ICU4J.