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

时间:2013-03-03 20:46:10

标签: 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];

6 个答案:

答案 0 :(得分:123)

最后,我使用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;
}

答案 1 :(得分:79)

也许最简单,最安全的方法是使用Apache Commons Lang

中的StringUtils
StringUtils.stripAccents(String input)
  

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

StringUtils的。stripAccents()

答案 2 :(得分:7)

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

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:3)

对于kotlin

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

答案 5 :(得分:-6)

谢谢

public static final Pattern DIACRITICS_AND_FRIENDS = Pattern.compile(
                              "[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+");

private static String stripDiacritics(String str) {
    str = Normalizer.normalize(str, Normalizer.Form.NFD);
    str = DIACRITICS_AND_FRIENDS.matcher(str).replaceAll("");
    return str;
}

=> stripDiacritics(“EtÇaserasamoitié。”);