2017-05-15 2 views
2

In Anbetracht der folgenden Java-Code, der eine kleine Zeichenfolge Vergleich der German grapheme ßGroß- und Kleinschreibung Vergleiche zwischen den Schauplätzen in Java

String a = "ß"; 
String b = a.toUpperCase(); 

assertTrue(a.equalsIgnoreCase(b)); 

Der Vergleich enthält, nicht auf, weil „ß“ .toUpperCase() tatsächlich gleich „SS“ ist, und Das endet bei einem Check-in equalsIgnoreCase(). Die Javadocs für toUpperCase() erwähnen diesen Fall explizit, aber ich verstehe nicht, warum das nicht geht, the capital variant of ß?

Allgemeiner gesagt, wie sollten wir Vergleiche zwischen Groß- und Kleinschreibung vornehmen, möglicherweise über verschiedene Ländergrenzen hinweg? Sollten wir nur immer entweder toUpper() oder equalsIgnoreCase() verwenden, aber niemals beides?

Es scheint, dass das Problem ist, dass die Umsetzung der equalsIgnoreCase() die folgende Überprüfung beinhaltet: anotherString.value.length == value.length, die mit dem Javadocs für toUpper() unvereinbar scheint, die besagen:

Da Fall Zuordnungen sind nicht immer 1: 1 char Zuordnungen, die resultierende String möglicherweise eine andere Länge als die ursprüngliche Zeichenfolge.

+0

Sie müssten einen ['Collator'] (http://docs.oracle.com/javase/7/docs/api/java/text/Collator.html) anstelle der integrierten Methoden von' verwenden String'. –

+0

'SS' ist der Großbuchstabe, weil [es ist in Unicode definiert] (http://www.fileformat.info/info/unicode/char/00df/index.htm). –

+0

@AndyTurner das ist seltsam, weil es einen Unicode-Codepunkt für das Großbuchstabe gibt, und definiert dieses Zeichen als Kleinbuchstaben http://www.fileformat.info/info/unicode/char/1e9e/index.htm – Oleksi

Antwort

3

Javas Collator Klasse wurde für verschiedene länderspezifische Textvergleichsoperationen entwickelt. Da das Konzept von "Großbuchstaben" ziemlich unterschiedlich zwischen Gebietsschemata variiert, verwendet Collator ein feinkörnigeres Modell namens Vergleich Stärke. Es gibt vier Ebenen, und wie sie sich auf Vergleiche auswirken, hängt vom Gebietsschema ab.

Hier ist ein Beispiel von Collator mit dem deutschen Gebietsschema für Groß- und Kleinschreibung Vergleich des Schreibens mit ß:

Collator germanCollator = Collator.getInstance(Locale.GERMAN); 
int[] strengths = new int[] {Collator.PRIMARY, Collator.SECONDARY, 
          Collator.TERTIARY, Collator.IDENTICAL}; 

String a = "ß"; 
String b = "ß".toUpperCase(); 

for (int strength : strengths) { 
    germanCollator.setStrength(strength); 
    if (germanCollator.compare(a, b) == 0) { 
     System.out.println(String.format(
       "%s and %s are equivalent when comparing differences with " 
       + "strength %s using the GERMAN locale.", 
       a, b, String.valueOf(strength))); 
    } 
} 

Der Code druckt

 
ß and SS are equivalent when comparing differences with strength 0 using the GERMAN locale. 
ß and SS are equivalent when comparing differences with strength 1 using the GERMAN locale. 

was bedeutet, dass die deutschen locale dieser Auffassung zwei Strings gleich in PRIMARY und SECONDARY Stärke Vergleiche.

Verwandte Themen