toLowerCase () в Java при использовании с Locale не дает точного результата

Взгляните на следующий фрагмент кода на 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?`
    }
}

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

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

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


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


person Lion    schedule 12.12.2011    source источник
comment
Попробуйте отобразить каждый из 3 символов в lowerCaseStr как шестнадцатеричное число.   -  person Mark Ransom    schedule 12.12.2011


Ответы (3)


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

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

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

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

person Olivier Croisier    schedule 12.12.2011

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

Before case conversion is Ì and length is 1
Lower case is i?? and length is 3
person Tudor    schedule 12.12.2011
comment
Я получаю тот же результат, что и упомянутый в самом вопросе, с NetBeans 6.9.1. - person Lion; 12.12.2011

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

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

person dku.rajkumar    schedule 12.12.2011
comment
Конечно, это не настоящие вопросительные знаки; это знаки ударения, которые отображаются как вопросительные знаки из-за проблем с кодировкой символов. - person ruakh; 12.12.2011