2013-03-03 17 views
45

Voglio modificare questa frase:Un modo semplice per rimuovere gli accenti UTF-8 da una stringa?

Et ça sera sa moitié.

A:

Et ca sieri sa moitie.

C'è un modo semplice per farlo in Java, come farei in 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

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

+1

Questo non ha nulla a che fare con UTF- 8 o qualsiasi altra codifica di caratteri. – Jesper

risposta

89

Finalmente ho risolto:

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

Questa funzione rimuove i caratteri o sostituisce i caratteri con accenti agli equivalenti senza accenti? Sto chiedendo, perché questo: 'replaceAll (" [^ \\ p {ASCII}] "," ")' sembra una sostituzione con niente (rimozione). – Kamil

+0

Hai ragione, ho appena modificato la mia risposta (lo scopo è ovviamente quello di sostituire e non rimuovere i caratteri). – Rob

+1

Per trasformare correttamente alcune stringhe, ho usato ** 'Form.NFKD' ** (" Scomposizione della compatibilità ".) –

5

Supponendo che si sta utilizzando Java 6 o più recente, si potrebbe voler dare un'occhiata a Normalizer, che può decomporre accenti, quindi utilizzare una regex per mettere a nudo la combinando accenti.

In caso contrario, si dovrebbe essere in grado di ottenere lo stesso risultato utilizzando ICU4J.

+0

Sì, assolutamente questo è quello che ho fatto, grazie. – Rob

53

Forse il modo più semplice e più sicuro sta usando StringUtils da Apache Commons Lang

StringUtils.stripAccents(String input) 

Rimuove i segni diacritici (~ = accenti) da una stringa. Il caso non sarà modificato . Ad esempio, 'à' sarà sostituito da 'a'. Si noti che le legature rimarranno invariate.

StringUtils. stripAccents()

+4

Si noti che è Apache Commons Lang3, non Commons Lang –

+0

Va bene, ma non funziona con 'Ø'. – OlgaMaciaszek

-5

grazie

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

5

Immagino che l'unica differenza è che io uso un + e non un [] rispetto alla soluzione. Penso che entrambi funzionino, ma è meglio averlo anche qui.

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