2009-08-26 9 views
14

moje pierwsze pytanie tutaj :-)
Czy moje najlepsze czytanie zasad i wyszukiwanie, jeśli pytanie było już wcześniej zadawane.Java's equalsIgnoreCase kończy się niepowodzeniem z ß ("Sharp S" używany w alfabecie niemieckim)

Następujący kod

String[] strings = {"cAsE", "\u00df"}; 
    for (String str : strings) { 
     System.out.println(str.equalsIgnoreCase(str.toLowerCase())); 
     System.out.println(str.equalsIgnoreCase(str.toUpperCase())); 
    } 

wyjścia prawdziwe 3 razy (przypadek = przypadków; case = przypadków; SS = SS) ale również 1 fałszywy (SS = SS!). Próbowałem przy użyciu toLowerCase (Locale), ale to nie pomogło.

Czy to znany problem?

+1

Michael Kaplan napisał obszernie o niemieckiej postaci Sharp S. Sprawy ostatnio się zmieniły i spodziewam się, że biblioteki będą nadrabiać zaległości. Wiele dobrych informacji tutaj: http://blogs.msdn.com/michkap/archive/2008/05/15/8506679.aspx –

Odpowiedz

10

Do niedawna Unicode nie definiował wielkiej wersji s-sharp. Nie jestem pewien, czy najnowsza wersja Java 7 zawiera już tę nową postać i czy obsługuje ją poprawnie. Proponuję spróbować.

Powodem str.toLowerCase() nie wraca tak samo jak to, że Java str.toUpperCase().toLowerCase() zastępuje ß z SS ale nie ma sposobu, aby wrócić, więc SS staje ss i porównać się nie powiedzie.

Jeśli więc chcesz wyrównać obudowę, musisz użyć str.toLowerCase(). Jeśli nie, to po prostu wywołanie equalsIgnoreCase() bez jakiejkolwiek wyższej/niższej konwersji powinno również działać.

+1

Nawet jeśli Java 7 obsługuje nowy znak Unicode, "ß" .toUpperCase() wciąż musi powracać "SS", ponieważ duża literka "ß" ma jedynie charakter typograficzny i nie jest tak naprawdę używana w środowisku naturalnym: http: //en.wikipedia.org/wiki/Capital_ß –

+0

W moim przypadku próbuję dopasować ciągi niektórych użytkowników do predefiniowanych (może powinienem był o tym wspomnieć w oryginalnym pytaniu ...) Kod podany tutaj jako przykład to tylko test, który przeprowadziłem, aby zrozumieć, dlaczego mój oryginalny kod nie działał zgodnie z oczekiwaniami. Oczywiście istnieje metoda equalsIgnoreCase, aby uchronić nas przed zmianą wielkości liter w łańcuchach. W każdym razie, koncepcja "niwelacji" sprawia, że ​​jest to moja akceptowana odpowiedź :-) – targumon

0

Hm. Nie wiem nic o języku niemieckim, ale nie jestem pewien, co sądzę o tym, że znaki Unicode są traktowane jako odpowiednik rozszerzenia literami rzymskimi. Czy możesz wykonać następujące czynności?

myDictionary.put("glasses", new Bifocals()); 
myDictionary.get("glaßes"); 

Jeśli masz swoje druthers, myDictionary.get("glaßes") powinien powrócić coś się Bifocals sprzed. Czy to jest legalne?

+2

"ß" i "ss" nie są równoważne. "ss" jest czasem używane do pisania "ß", gdy ta litera nie jest dostępna. Ponieważ nie ma dużej litery "ß" (ok, jest jedna, ale jest to głównie ciekawostka typograficzna, a nie litera używana w rzeczywistości), zawsze będzie zapisana jako "SS" w CAŁOŚCI. Przeciwieństwo nie jest prawdziwe: "SS" .toLower() to zdecydowanie "ss". –

+0

Ah, gotcha. Dziękuję za wyjaśnienia, Joachim. –

2

Aaron Digulla has it. Ponadto, nie ma sensu przekształcać ciąg w przypadku braku danych regionalnych. W języku angielskim górny kod: i to I, ale w języku tureckim jest to & # x0130;. String.compareIgnoreCase nie uwzględnia danych regionalnych.

(Tak na marginesie, warto zajrzeć do normalization, lub będziesz skończyć się zastanawiać, dlaczego "& # x00E9;" równa ("& # x0065; & # x0301;".) może return false . Powód: jeden jest combining sequence)

+0

to jest dziwne dla mnie, że klasa String ma 2 sposoby każdy dla toLowerCase & toUpperCase (jeden bez parametrów + taki, który akceptuje Locale) ale tylko 1 sposób każdy dla equalsIgnoreCase & compareToIgnoreCase jeśli faceci w Sun zdaniem * Metody przypadku powinny być wrażliwe na lokalizację, dlatego oczekuję, że wszyscy je zaakceptują. Dzięki za link normalizacji, jest to przesada dla mojej sprawy, ale wnikliwe wszystko to samo. – targumon

+0

@ plargumon: Zauważ, że w * all * locale '" ß ".toUpperCase (locale)' zwraca '" SS "', ale equalsIgnoreCase nie obchodzi. Wszystko jakoś zepsute. – maaartinus

2

Unicode nie definiują wielką wersji s-ostry to jest dokładnie punkt - w jezyku niemieckim nie ma możliwości wystąpienia ostrych s (. ß) jest kapitałem lub początkową literą dowolnego słowa. w związku z tym nie ma sensu spierać się o kapitał ß ...

Powiązane problemy