2009-08-26 3 views
14

ma première question ici :-)
A fait ma meilleure lecture des règles et la recherche si la question a déjà été posée avant.EqualsIgnoreCase de Java échoue avec ß ("Sharp S" utilisé dans l'alphabet allemand)

Le code suivant

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

sorties vraie 3 fois (= cas, Casé = CASE; Casé ß = ß) mais aussi 1 faux (ß = SS!). Essayé en utilisant toLowerCase (Locale) mais cela n'a pas aidé.

Est-ce un problème connu?

+1

Michael Kaplan a beaucoup écrit sur le personnage allemand Sharp S. Les choses ont changé récemment et je m'attends à ce que les bibliothèques jouent un rattrapage. Beaucoup de bonnes informations ici: http://blogs.msdn.com/michkap/archive/2008/05/15/8506679.aspx –

Répondre

10

Jusqu'à récemment, Unicode ne définissait pas de version majuscule de s-sharp. Je ne suis pas sûr si la dernière version de Java 7 inclut déjà ce nouveau caractère et s'il le manipule correctement. Je suggère de l'essayer.

La raison pour laquelle str.toLowerCase() ne retourne pas la même chose que str.toUpperCase().toLowerCase() est que Java remplace ß avec SS mais il n'y a aucun moyen de revenir en arrière, donc SS devient ss et le comparer échoue.

Donc, si vous devez mettre le boîtier de niveau, vous devez utiliser str.toLowerCase(). Si ce n'est pas le cas, il suffit d'appeler equalsIgnoreCase() sans conversion supérieure/inférieure.

+1

Même si Java 7 supporte le nouveau caractère Unicode, "ß" .toUpperCase() doit toujours retourner "SS", puisque le "ß" majuscule n'a qu'un intérêt typographique et n'est pas vraiment utilisé dans la nature: http: //en.wikipedia.org/wiki/Capital_ß –

+0

Dans mon cas, j'essaie de faire correspondre les chaînes de certains utilisateurs avec des chaînes prédéfinies (peut-être que j'aurais dû le mentionner dans la question originale ...) Donc le code que j'ai donné ici est un exemple test j'ai effectué pour comprendre pourquoi mon code d'origine n'a pas fonctionné comme prévu. Évidemment, la méthode equalsIgnoreCase existe pour nous éviter de changer la casse des deux chaînes. Quoi qu'il en soit, le concept de "nivellement" est ce qui fait que cette réponse est acceptée :-) – targumon

0

Hm. Je ne sais rien de la langue allemande, mais je ne suis pas sûr de ce que je ressens à propos des caractères Unicode étant traités comme équivalents à une extension de lettre romaine. Devriez-vous être en mesure de faire ce qui suit?

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

Si vous avez votre druthers, myDictionary.get("glaßes") devrait retourner quelque chose que le Bifocals d'avant. Est-ce légitime?

+2

"ß" et "ss" ne sont pas équivalents. "ss" est parfois utilisé pour écrire "ß" quand cette lettre n'est pas disponible. Comme il n'y a pas de majuscule "ß" (ok, il y en a un, mais c'est surtout une curiosité typographique et non une lettre utilisée dans la réalité) il sera toujours écrit "SS" dans TOUTES LES CAPS. L'inverse n'est pas vrai: "SS" .toLower() est définitivement "ss". –

+0

Ah, chéri. Merci pour la clarification, Joachim. –

2

Aaron Digulla has it. En outre, il n'est pas significatif de transformer la chaîne en l'absence de données locales. En anglais, le chiffre supérieur de i est I, mais en turc, il est & # x0130;. String.compareIgnoreCase ne prend pas en compte les données locales.

(En aparté, vous voudrez peut-être regarder dans normalization, ou vous finirez par se demander pourquoi "& # x00E9;" égal à égal ("& # x0065; & # x0301;".) peut retourner false . Raison: on est un combining sequence)

+0

il me est bizarre que la classe String a 2 méthodes chacun pour toLowerCase & toUpperCase (un sans paramètres + qui accepte Locale) mais seulement 1 méthode chacun pour equalsIgnoreCase & compareToIgnoreCase si les gars de Sun pensent que le * Les méthodes de cas devraient être sensibles aux paramètres locaux, alors je m'attends à ce que tous les acceptent. Merci pour le lien de normalisation, c'est une surpêche pour mon cas, mais perspicace tout de même. – targumon

+0

@targumon: Notez que dans * all * locales '' ß ".toUpperCase (locale)' renvoie '" SS "', mais equalsIgnoreCase ne s'en soucie pas. Tout est brisé d'une manière ou d'une autre. – maaartinus

2

Unicode ne définit pas une version en majuscules de s-forte c'est le point exact - dans la langue allemande, il n'y a aucune possibilité d'un-s pointu (. ß) étant une capitale ou la lettre initiale de n'importe quel mot. Par conséquent, son non-sens se contente d'un capital ß ...

Questions connexes