85

我想改变这句话:

Etça sera sa moitié。

到 :

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];
4

6 回答 6

165

最后,我通过使用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;
}
于 2013-03-03T20:58:52.087 回答
111

也许最简单和最安全的方法是使用StringUtilsApache Commons Lang

StringUtils.stripAccents(String input)

从字符串中删除变音符号(~= 重音符号)。案件不会改变。例如,“à”将被“a”替换。请注意,连字将保持原样。

字符串实用程序。带重音()

于 2013-03-03T21:23:49.940 回答
10

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

String normalized = Normalizer.normalize(input, Normalizer.Form.NFD);
String accentRemoved = normalized.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
于 2016-04-08T13:09:40.333 回答
6

对于科特林

fun stripAccents(s: String): String 
{
    var string = Normalizer.normalize(s, Normalizer.Form.NFD)
    string = Regex("\\p{InCombiningDiacriticalMarks}+").replace(string, "")
    return  string
}
于 2018-03-20T13:03:48.997 回答
5

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

否则,您应该能够使用ICU4J.

于 2013-03-03T20:59:59.100 回答
-5

谢谢你

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 Ça sera sa moitié." );

于 2014-12-25T07:54:48.947 回答