Question

Supposons deux objets String Java:

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

Est-il donc vrai que pour chaque valeur de l'expression <my string>

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

est évaluée à true?

Alors, est-ce String.toLowerCase() conserver la longueur de chaîne d'origine pour une valeur de chaîne?

Était-ce utile?

La solution

Étonnamment Finalité pas !!

A partir de Java docs de toLowerCase

  

Transforme tous les caractères dans cette chaîne en minuscules en utilisant les règles de l'endroit donné. la cartographie de cas est basée sur la version standard Unicode spécifiée par la classe de caractères. Étant donné que les correspondances de cas ne sont pas toujours 1: 1 correspondances char, la chaîne résultante peut être une longueur différente de celle de la chaîne d'origine

.

Exemple:

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)
    }
}

Autres conseils

Tout d'abord, je voudrais souligner que je suis absolument d'accord avec la réponse de @codaddict (actuellement la mieux notée).

Mais je voulais faire une expérience, voici donc:

Ce n'est pas une preuve formelle, mais ce code a couru pour moi sans jamais atteindre l'intérieur du if (en utilisant JDK 1.6.0 Update 16 sur Ubuntu):

Edit: Voici un code mis à jour qui gère aussi bien les versions localisées:

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() + ")");
            }
        }
    }
}

L'exécution de ce code avec les noms de paramètres régionaux mentionnés dans la réponse acceptée imprimera quelques exemples. Courir sans argument essayera tous les paramètres régionaux disponibles (et prendre un certain temps!).

Il est pas vaste, parce que théoriquement il pourrait y avoir des chaînes multi-caractères qui se comportent différemment, mais il est une bonne première approximation.

Notez également que la plupart des combinaisons de deux caractères produits ainsi sont UTF-16 probablement pas valide, donc le fait que explose rien dans ce code ne peut être attribué à une API de chaîne très robuste en Java.

Et last but not least: même si l'hypothèse est vraie pour la mise en œuvre actuelle de Java, qui peut facilement changer les versions une fois futures de Java mettre en œuvre les futures versions de la norme Unicode, dans lequel les règles pour les nouveaux personnages peuvent présenter des situations où cela ne tient plus.

Donc, selon c'est encore une idée assez mauvaise.

Rappelez-vous aussi que toUpperCase () ne conserve pas non plus la longueur. Exemple: « straße » devient « STRASSE » pour les paramètres régionaux allemand. Donc, vous êtes plus ou moins vissé si vous travaillez avec des chaînes sensibles à la casse et vous devez stocker l'index pour quelque chose.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top