Введение в Java

Модуль 3. Урок 1. Основы использования и создания методов в классах.

Konstantin Valeev

Как правильно компилировать код с кириллицей? У меня при компиляции возникает error: unmappable character for encoding Cp1252, пробовал добавлять -encoding="UTF-8" - javac не принимает параметр.

Сергей Алексеенко

Здравствуйте.

Было бы хорошо увидеть пример того, что Вы пытаетесь скомпилировать.

Java нормально работает с кириллицей, как с текстом. А вот код должен быть обязательно латиницей. Попробуйте сменить кодировку файла, который пытаетесь скомпилировать, в редакторе, до того как скормите его javac-у.

Konstantin Valeev

Компьютер рабочий, прав на такое нет. Если убрать все русские комментарии - код компилируется. Проблема понятна, спасибо!

Konstantin Valeev

Компилирую код, который вы приложили к уроку, ничего кроме:

public class Car { static int speed; public static void main(String... args) { Car ta4ka = new Car(); System.out.println("speed в хипе при создании объекта = " + ta4ka.speed); // 0 ta4ka.setSpeed(12); // Вызываем конкретную функцию(метод) из новосозданого объекта // Значение хранится в фрейме в переменной newSpeed } public void showSpeed() { // выводит значение из хипа по ссылке this System.out.println("speed в хипе на момент вызова \'showSpeed()\' = " + this.speed); } public void setSpeed(int newSpeed) { // принимаем значение 12. newSpeed это переменная объявленная внутри метода --> хранится в стеке фрейма метода this.speed = newSpeed; // записываем по this-ссылке в хип значение из стека метода setSpeed showSpeed();// выводим на экран значение из хипа // 12 newSpeed = 8;// записали новое значение в стеке в фрейме метода setSpeed System.out.println("переменная newSpeed в фрейме метода setSpeed в стеке = " + newSpeed); // 8 // присваиваем переменной speed новое значение = 3 speed = 3; // В стеке нет такой переменной, потому значение будет записано в хип! System.out.println("Java сама добавила this перед именем \'speed\' и записала новое значение speed в хип = " + this.speed); // 3 setSetSpeed(newSpeed); // передаем значение newSpeed = 8 } public void setSetSpeed(int speed) { // теперь и только теперь и в фрейме метода setSetSpeed в стеке есть своя переменная c именем speed! System.out.println("Значение speed в хипе = " + this.speed); // 3 speed = speed;//в стеке speed сама себя переприсваивает. System.out.println("переменная speed в фрейме стека = " + speed); // 8 this.speed = speed; // присваиваем значение speed из фрейма значению speed в хипе! System.out.println("Значение speed в хипе заданое уже методом setSetSpeed = " + this.speed); // показываем speed из хипа. // 8 } }

Sublime пишет что кодировка UTF-8.

Сергей Алексеенко

У меня этот код компилится и под Windows и под Ubuntu.

А какая версия ОС у вас (какого года)? Какая версия java, javac?

Андрей Абрашкин

Не знаю, в чём было дело, но конкретно в моём случае, компилятору не нравилась заглавная буква И. Причем не важно, в каком месте я её ставлю. Исправил на маленькую "и" и всё скомпилировалось.

Сергей Алексеенко

Андрей Абрашкин, первый способ тоже должен работать. Нужно внимательно произвести описанные действия. Там важно сохранять файл на каждом этапе. Можно еще включить отображение кодировок в Sublime: в настройках пользователя добавить "show_encoding": true. И ни в коем случае не впечатывать туда "И". ))

Konstantin Valeev

Microsoft Windows 10 Enterprise 10.0.17763 N/A Build 17763

java version "1.8.0_221" Java(TM) SE Runtime Environment (build 1.8.0_221-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

javac 1.8.0_221

Сергей Алексеенко

Что ж.

Это определенно проблема в самой операционной системе.

Скорее всего в настройках региональных стандартов нужно выставить "язык программ, не поддерживающих Юникод" с Английского на Русский. Но придется менять язык системы.

Есть возможность исправить проблему кодировки через реестр:

Запускаем regedit (Win + R —> regedit) и по пути \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage находим ключ ACP в котором нужно поменять значение (value data) с 1252 на 1251.

Потребуется перезагрузка системы.

UPD. В зависимости от качества дистрибутива системы, возможно, поможет установка дополнительных языковых пакетов через магазин или просто в настройках системы.

Сергей Алексеенко

Очевидно javac ничего не знает про "и" в верхнем регистре в UTF-8. И этот баг с буквой "И" я не смог победить в javac.

Но нашел еще два способа как обойти в общем проблему с кодировкой:

  1. Создать в Sublime текстовый файл в нужной кодировке, а потом туда скопировать код. Как создать: New File, потом file —> Save vith Encoding и сохраняем файл в нужной кодировке. И только потом копируем код в этот сохраненный файл. Сохраняем после копирования. Тестируем.
  2. Зайти в настройки региональных стандартов и нажать там одну галочку: скрин настроек.

В результате применения второго способа у меня пропала козябра в WindowsPowerShell, при исполнении данного кода. Побочных ефектов в других программах я пока не заметил.

Андрей Абрашкин

Сергей Алексеенко, первый способ - это самое первое, что я попробовал, но, к сожалению, не помогло. А вот крыж из второго способа, видимо, из 10ки, на win7 отсутствует. Спасибо за советы! Впервые вижу столь оперативную обратную связь)

Андрей Абрашкин

Сергей Алексеенко, у меня в реестре всё так, как вы рекомендуете и в настройках региональных стандартов тоже, однако проблему это не решает. Ошибка есть.

Андрей Абрашкин

Сергей Алексеенко, ааа, не впечатывать "И"))) Тогда да, тогда сорри, недопонял, тогда всё работает! Без "И")) Честно говоря, Sublime мне как-то не зашёл... Давно правда это было. Может сейчас изменится мнение, но я пока на Notepad++ и AkelPad сижу. В Npp вкладки и подсветка синтаксиса. В AkelPad удобство смены кодировки и работы с текстом больших размеров. Надо бы снова присмотреться к Sublime...