2012-07-03 17 views
8

Dla przykładu -Skąd mogę wiedzieć, że mój ciąg zawiera znaki diakrytyczne?

text = Československá obchodní banka; 

text string contains diacritics like Č , á etc. 

Chcę napisać funkcję, gdzie będzie przechodzić ten ciąg "Československá obchodní banka" i function will return true if string contains diacritics else false.

Muszę obsługiwać znaki diakrytyczne i ciąg znaków, które zawierają znaki, które nie mieszczą się w zakresie A-z lub a-z oddzielnie.

1) If String contains diacritics then I have to do some XXXXXX on it. 

2) If String contains character other than A-Z or a-z and not contains diacritics then do some other operations YYYYY. 

nie mam pojęcia jak to zrobić.

+0

Jaka jest przypadek użycia? Przez "znaki diakrytyczne" masz na myśli, że chcesz szukać liter zawierających znaki diakrytyczne, czy też masz na myśli * każdą literę *, która nie znajduje się w zakresie A-Z? A co powiesz na nie-łacińskie litery, takie jak "じ", które możesz twierdzić, zawierające japoński odpowiednik znaków diakrytycznych? – deceze

+0

dlaczego nie sprawdzać każdego znaku w łańcuchu i parsować go do int, cokolwiek ponad 127 byłoby diakrytyczne –

+1

@David To trochę zbyt uproszczone i właśnie dlatego pytałem, o co pytałem powyżej. Nie wiedziałem, że "μ" zawiera znaki diakrytyczne. – deceze

Odpowiedz

11

Jedna wiedza: w kodzie Unicode istnieje kod dla á, ale ten sam wynik można uzyskać za pomocą a i combining mark-'.

Można użyć java.text.Normalizer, co następuje:

public static boolean hasDiacritics(String s) { 
    // Decompose any á into a and combining-'. 
    String s2 = Normalizer.normalize(s, Normalizer.Form.NFD); 
    return s2.matches("(?s).*\\p{InCombiningDiacriticalMarks}.*"); 
    //return !s2.equals(s); 
} 
+0

Poprawiłem moją odpowiedź: jeśli oryginał już zawierał rozłożony test "równa się równości" nie powiodłby się. –

4

Wydaje się, że klasa Normalizer jest w stanie to osiągnąć. Niektóre ograniczone testy wskazują, że może być to, czego potrzebujesz:

Normalizer.isNormalized(text, Normalizer.Form.NFD) 

.

Powiązane problemy