Frage

Nehmen wir zwei Java-String-Objekte:

String str = "<my string>";
String strLower = str.toLowerCase();

Ist es dann richtig, dass für den Ausdruck jeden Wert von <my string>

str.length() == strLower.length()

auswertet zu true?

Also, tut String.toLowerCase() für jeden Wert von String ursprünglicher String-Länge zu erhalten?

War es hilfreich?

Lösung

Überraschenderweise tut es nicht !!

Von Java-Dokumentation von toLowerCase

  

Wandelt alle Zeichen in diesem String Fall zu senken, die Regeln des gegebenen Locale verwenden. Fallzuordnung basiert auf der Unicode-Standard-Version der Zeichenklasse angegeben. Da Fall Zuordnungen sind nicht immer 1: 1 char-Mappings, der resultierende String eine andere Länge als der ursprüngliche String sein kann,

.

Beispiel:

package com.stackoverflow.q2357315;

import java.util.Locale;

public class Test {
    public static void main(String[] args) throws Exception {
        Locale.setDefault(new Locale("lt"));
        String s = "\u00cc";
        System.out.println(s + " (" + s.length() + ")"); // Ì (1)
        s = s.toLowerCase();
        System.out.println(s + " (" + s.length() + ")"); // i̇̀ (3)
    }
}

Andere Tipps

Zunächst einmal möchte ich darauf hinweisen, dass ich absolut mit dem zustimmen (derzeit am höchsten bewerteten) Antwort von @codaddict.

Aber ich wollte ein Experiment tun, so ist es hier:

Es ist kein formaler Beweis, aber dieser Code läuft für mich, ohne jemals das Innere der if zu erreichen (mit JDK 1.6.0-Update 16 auf Ubuntu):

Edit: Hier einige aktualisierte Code, dass Griffe Locales auch:

import java.util.Locale;

public class ToLowerTester {
    public final Locale locale;

    public ToLowerTester(final Locale locale) {
        this.locale = locale;
    }

    public String findFirstStrangeTwoLetterCombination() {
        char[] b = new char[2];
        for (char c1 = 0; c1 < Character.MAX_VALUE; c1++) {
            b[0] = c1;
            for (char c2 = 0; c2 < Character.MAX_VALUE; c2++) {
                b[1] = c2;
                final String string = new String(b);
                String lower = string.toLowerCase(locale);
                if (string.length() != lower.length()) {
                    return string;
                }
            }
        }
        return null;
    }
    public static void main(final String[] args) {
        Locale[] locales;
        if (args.length != 0) {
            locales = new Locale[args.length];
            for (int i=0; i<args.length; i++) {
                locales[i] = new Locale(args[i]);
            }
        } else {
            locales = Locale.getAvailableLocales();
        }
        for (Locale locale : locales) {
            System.out.println("Testing " + locale + "...");
            String result = new ToLowerTester(locale).findFirstStrangeTwoLetterCombination();
            if (result != null) {
                String lower = result.toLowerCase(locale);
                System.out.println("Found strange two letter combination for locale "
                    + locale + ": <" + result + "> (" + result.length() + ") -> <"
                    + lower + "> (" + lower.length() + ")");
            }
        }
    }
}

Sie diesen Code mit dem locale Namen Laufen in der akzeptierten Antwort erwähnt wird einige Beispiele drucken. Laufen sie ohne Argument werden versuchen, alle verfügbaren Locales (und eine ganze Weile dauern!).

Es ist nicht sehr umfangreich, weil theoretisch dort mit mehreren Zeichen Strings sein könnte, dass verhält sich anders, aber es ist eine gute erste Annäherung.

Beachten Sie auch, dass viele der Zwei-Zeichen-Kombinationen erzeugen diese Art und Weise ist wahrscheinlich ungültige UTF-16, so dass nichts explodiert in diesem Code kann nur auf ein sehr robustes String-API in Java verantwortlich gemacht werden.

Und last but not least: auch wenn die Annahme gilt für die aktuelle Implementierung von Java, die leicht einmal zukünftigen Versionen von Java implementieren Versionen der Unicode-Standard Zukunft ändern können, in dem die Regeln für neue Charaktere einführen Situationen, in denen dies nicht mehr gilt.

auf diese Also je ist immer noch eine ziemlich schlechte Idee.

Denken Sie auch daran, dass toUpperCase () nicht die Länge entweder bewahren. Beispiel: „Straße“ wird „STRASSE“ für den deutschen locale. So können Sie mehr oder weniger eingeschraubt sind, wenn Sie mit Groß- und Kleinschreibung Strings arbeiten, und Sie müssen den Index für etwas speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top