Метод toLowerCase () в Java при использовании с Locale не дает точного результата - PullRequest
4 голосов
/ 12 декабря 2011

Посмотрите на следующий фрагмент кода в Java.

final public class Main
{
    public static void main(String[] args) 
    {
        Locale.setDefault(new Locale("lt")); 
        String str = "\u00cc";   //setting Lithuanian as locale

        System.out.println("Before case conversion is "+str+" and length is "+str.length());// Ì
        String lowerCaseStr = str.toLowerCase();
        System.out.println("Lower case is "+lowerCaseStr+" and length is "+lowerCaseStr.length());// i?`
    }
}

Отображает следующий вывод.

До преобразования регистра is и длина 1

Нижний регистр - это i̇̀, а длина - 3


В первом операторе System.out.println() результат является точным.Однако во втором операторе отображается длина 3 , которая фактически должна была быть 1 .Я не понимаю, почему?

Ответы [ 3 ]

5 голосов
/ 12 декабря 2011

Разные языки имеют разные правила для преобразования в верхний или нижний регистр.

Например, в немецком языке строчная буква ß становится двумя заглавными буквами S, поэтому слово «straße» (улица) длиной 6 символов становится «STRASSE» длиной 7 символов.

Вот почему ваши струны в верхнем и нижнем корпусах имеют разную длину.

Я писал об этом в одном из моих Java-тестов: http://thecodersbreakfast.net/index.php?post/2010/09/24/Java-Quiz-42-%3A-A-string-too-far

1 голос
/ 12 декабря 2011

Это полностью дублирует Сохраняет ли Java toLowerCase () исходную длину строки? .Это очень полезно и очень ответно.длина str и str.toLowerCase () не всегда одинаковы, потому что разговор зависит от кода каждого символа.

В этом случае второй вывод «Нижний регистр i?? и длина 3»,он тянется вдвоем?Отметьте так, длина составляет 3.

1 голос
/ 12 декабря 2011

Я получаю другой результат:

Before case conversion is Ì and length is 1
Lower case is i?? and length is 3
...