Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Как кодировка *.java файла влияет на тип char в Java?

#java #char #encoding


Почему данный фрагмент кода выводит 0, если кодировка кода в Windows-1251 и 15 если
кодировка UTF-8?

String s1 = "П";
String s2 = "А";
System.out.println(s1.compareTo(s2));


В таблице UTF-8 отсутствует кириллица, а в Windows-1251 есть все кириллические символы.
Поправьте, если ошибаюсь.
    


Ответы

Ответ 1



Проведем эксперимент: public class Cp1251Src { public static void main( String[] args ) { String s1 = "П"; String s2 = "А"; System.out.println(s1.compareTo(s2)); } } Сохраним файл в кодировке cp1251, попробуем собрать javac 1.8.0_45 с указанием правильной кодировки: >javac -encoding cp1251 Cp1251Src.java >java Cp1251Src 15 15 - правильный ответ, т.к. String.compareTo возвращает разность первых отличающихся символов. Укажем неправильную кодировку: >javac -encoding utf8 Cp1251Src.java Cp1251Src.java:3: error: unmappable character for encoding utf8 String s1 = "?"; ^ Cp1251Src.java:4: error: unmappable character for encoding utf8 String s2 = "?"; ^ 2 errors javac отказывается компилировать, т.к. не может преобразовать байты файла в символы, используя указанную кодировку. IDEA у меня нет, но есть Eclipse. Если в нем указать кодировку файла UTF-8, то вместо "А" и "П" будет виден символ "�" (U+FFFD, REPLACEMENT CHARACTER). Код успешно скомпилируется, выполнится и выведет 0, т.к. строки теперь равны. Т.е. там, где javac из-за ошибки преобразования байт в символы отказывается продолжать работу, Eclipse (и, скорее всего, Idea), заменяют непреобразуемые байты на U+FFFD, и работает дальше. А если файл, сохраненный в кодировке Utf-8 скомпилировать с параметром -encoding cp1251, программа выведет 13.

Ответ 2



На тип char кодировка java-файла не влияет. Компилятор java не может волшебным образом догадаться, какая кодировка у вашего файла. Он использует какую-то кодировку по умолчанию, которую спрашивает у вашей системы. Чтобы всё работало, компилируйте с параметром javac -encoding utf-8 ... или javac -encoding cp1251 ..., указывая именно ту кодировку, которую вы реально используете.

Комментариев нет:

Отправить комментарий