2013-03-03 17 views
45

Chcę zmienić to zdanie:Łatwy sposób na usunięcie akcentów UTF-8 z ciągu znaków?

Et ça sera sa moitié.

Do:

Et ca sera sa moitié.

Czy jest to prosty sposób w Javie, tak jak robiłbym w 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

Duplikat http://stackoverflow.com/questions/3322152/java-getting-rid-of-accents-and-converting-them-to-regular-letters – halex

+1

To nie ma nic wspólnego z UTF- 8 lub jakiekolwiek inne kodowanie znaków. – Jesper

Odpowiedz

89

końcu rozwiązany go:

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

Czy to usuwa znaki, czy zastępuje znaki akcentami odpowiedników bez akcentów? Pytam, ponieważ: 'replaceAll (" [^ \\ p {ASCII}] "," ")' wygląda jak zastąpienie bez niczego (usuwanie). – Kamil

+0

Masz rację, właśnie zredagowałem swoją odpowiedź (celem jest oczywiście zamiana i nie usuwanie postaci). – Rob

+1

Aby poprawnie przekształcić niektóre ciągi, użyłem ** 'Form.NFKD' ** (" Dekompatybilność kompatybilności. ") –

5

Zakładając, że używasz Java 6 lub nowszy, warto spojrzeć na Normalizer, które mogą rozkładać akcenty, a następnie użyć regex odebranie łącząc akcenty.

W przeciwnym razie powinieneś być w stanie osiągnąć ten sam rezultat za pomocą ICU4J.

+0

Tak, właśnie to zrobiłem, dzięki. – Rob

53

Może najłatwiej i najbezpieczniej jest wykorzystujące StringUtils z Apache Commons Lang

StringUtils.stripAccents(String input) 

Usuwa znaki diakrytyczne (~ = akcenty) ze sznurkiem. Sprawa nie zostanie zmieniona . Na przykład "à" zostanie zastąpione przez "a". Zauważ, że ligatury pozostaną niezmienione.

StringUtils. stripAccents()

+4

Zauważ, że to Apache Commons Lang3, nie Commons Lang –

+0

To dobrze, ale nie zadziała dla "Ø". – OlgaMaciaszek

-5

dziękuję

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é.");

5

Chyba jedyną różnicą jest to, że używam +, a nie [] w porównaniu do rozwiązania. Myślę, że obie prace, ale lepiej mieć to również tutaj.

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