2013-03-03 89 views
45

我想改变这句话:简单的方法从字符串中删除UTF-8口音?

etçasera samoitié。

到:

的Et CA血清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]; 
+1

http://stackoverflow.com/questions/3322152/java-getting-rid-of-accents-and-converting-them-to-regular-letters – halex 2013-03-03 21:00:18

+1

的重复这有什么好做UTF- 8或任何其他字符编码。 – Jesper 2015-04-27 08:30:22

回答

89

最后我解决了它:

public static String stripAccents(String s) 
{ 
    s = Normalizer.normalize(s, Normalizer.Form.NFD); 
    s = s.replaceAll("[\\p{InCombiningDiacriticalMarks}]", ""); 
    return s; 
} 
+0

这是删除字符,还是用没有重音的等同词替换带有重音符号的字符?我问,因为这:'replaceAll(“[^ \\ p {ASCII}]”,“”)'看起来像没有任何东西(删除)替换。 – Kamil 2013-03-03 21:26:14

+0

你是对的,我只是编辑了我的答案(目的当然是要替换而不是删除角色)。 – Rob 2013-03-03 21:28:22

+1

为了正确地转换一些字符串,我使用**'Form.NFKD' **(“Compatibility decomposition。”) – 2013-07-24 12:31:05

5

假设你使用的是Java 6或更高版本,你可能想看看Normalizer,能分解口音,然后用正则表达式来剥离结合口音。

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

+0

是的,绝对是我做的,谢谢。 – Rob 2013-03-03 21:01:54

53

Apache Commons Lang

StringUtils.stripAccents(String input) 

也许最简单和最安全的方法是使用StringUtils的删除字符串附加符号(〜=重音)。这种情况将不会被更改为 。例如,'à'将被替换为'a'。请注意, 连字将保持原样。

StringUtils。 stripAccents()

+4

请注意,它是Apache Commons Lang3,不是Commons Lang – 2015-10-05 11:30:29

+0

这很好,但不适用于'Ø'。 – OlgaMaciaszek 2017-11-13 15:12:46

-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( “CA的Et血清SAmoitié。”);

5

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

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