2013-03-03 77 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}+", "");