2015-09-22 16 views
5

Próbuję przekonwertować cały łaciński znaków Unicode na ich [a-z] reprezentacjijak wymienić łaciński unicode charakter [AZ] znaków

ó --> o 
í --> i 

mogę łatwo zrobić jeden po drugim na przykład:

myString = myString.replaceAll("ó","o"); 

ale ponieważ jest mnóstwo odmian, to podejście jest po prostu niepraktyczne

Czy jest inny sposób robienia tego w Javie? na przykład regular Expression lub Przypadek utility library

ZASTOSOWANIE:

1- nazw miejscowości z innym języku angielskim E.C.

Espírito Santo -> Espirito Santo,

+0

http://stackoverflow.com/a/25057742/984823 Ale nadal być świadomi pewnych wyjątków, takich jak l-suw. –

+0

To bardzo prymitywne podejście do twojego przypadku użycia. W języku niemieckim, w sytuacjach, w których można wyświetlić tylko ASCII, umlaut zostaje zastąpiony przez e po znaku, np. München staje się Muenchen. A prawdziwą angielską nazwą tego miasta jest Monachium. Proponuję po prostu zostawić akcenty. Jeśli aplikacja nie jest w stanie wyświetlić tych akcentów, twoja aplikacja jest straszliwie zepsuta. – roeland

+0

@roeland tak rozumiem, problem polega na tym, że wyobraź sobie Monachium w wielu różnych językach, każdy język ma to inaczej. teraz wyobraź sobie w dużych danych, próbując przeanalizować wszystkie te dane ... dobrze, jak myślę, może nie dać nam właściwego miasta, ale conajmniej stara się je znormalizować "w miarę możliwości" (jest powiedzenie, jeśli stawka jest ponad 80% jest wystarczająco dobre). to jest to, do czego zmierzamy – nafas

Odpowiedz

7

Ta odpowiedź wymaga Java 1.6 lub nowszy, który dodaje java.text.Normalizer.

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

Przykład:

public class Main { 
    public static void main(String[] args) { 
     String input = "Árvíztűrő tükörfúrógép"; 
     System.out.println("Input: " + input); 
     String normalized = Normalizer.normalize(input, Normalizer.Form.NFD); 
     System.out.println("Normalized: " + normalized); 
     String accentRemoved = normalized.replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
     System.out.println("Result: " + accentRemoved); 
    } 
} 

Wynik:

Input: Árvíztűrő tükörfúrógép 
Result: Arvizturo tukorfurogep 
+0

@JoopEggen Nie wiem jak to działa, po prostu wiem, że to działa :) – EpicPandaForce

+1

@EpicPandaForce Nie próbuję zastąpić ich "". na przykład I chcesz repalce "í" z "i" – nafas

+1

Pierwsza normalizacja zastępuje pojedynczy znak 'í' z ASCII' i' plus zero-width '''. Następnie wszystkie te akcenty, łącząc znaki diakrytyczne, są usuwane. Pozostań literami ASCII. D w NFD oznacza Decompose. –