Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Русификация консоли в Windows


Автор: LSD 1.8.2007, 15:16
При запуске программы в консоли Windows, часто бывает проблема с отображением русских букв. В данной ситуации возможно два решения - "исправить" консоль в Windows или "исправить" программу.

Проблема эта возникает из-за того, что умолчальная кодировка Windows - windows-1251, а в консоли Windows используется кодировка Cp866. Возможно 4 разных пути решения данной проблемы.

Первый вариант, самый предпочтительный и не требует менять код, так что подходит для любой программы. Запускаем консоль, щелкаем на заголовке окна и выбираем свойства. В свойствах на закладке Шрифт ставим шрифт Lucida Console и жмем ОК. Далее набираем в консоли ChCp 1251, в ответ получаем Текущая кодовая страница: 1251. Теперь запускаем Java программу и убеждаемся, что все работает. При желании можно написать bat-файл куда вставить ChCp 1251 и создать для этого файла ярлык, в свойствах которого прописать шрифт Lucida Console.

Второй вариант - изменить умолчальную кодировку для Java программ. Менять исходный код программы тоже не требуется, но возможны некоторые побочные эффекты. Например FileWriter и все использующие его компоненты, будут писать файлы не в windows-1251, а в Cp866. Так же возможны проблемы с драйверами БД, которые по умолчанию ориентируются на системную кодировку. Чтобы изменить умолчальную кодировку для Java программ надо при запуске указать JVM параметр -Dfile.encoding=XXX, например так:
Код
java -Dfile.encoding=Cp866 -jar program.jar


Третий вариант требует некоторого изменения исходного кода, надо при инициализации программы изменить PrintStream отвечающий за вывод в консоль, и настроить его на кодировку Cp866. УДобство этого метода состоит в том, что пользователю не надо ничего настраивать. Для этого в классе содержащем main() надо прописать:
Код
static
{
  try
  {
    if(System.getProperty("os.name").toLowerCase().contains("windows"))
    {
      PrintStream out = new PrintStream(System.out, true, "Cp866");
      PrintStream err = new PrintStream(System.err, true, "Cp866");
      System.setOut(out);
      System.setErr(err);
    }
  }
  catch(UnsupportedEncodingException e)
  {
    System.err.println("Couldn't change console encoding " + e);
  }
}


Четвертый вариант доступен начиная с JDK 1.6. Для вывода в консоль использовать не стандартный поток вывода и ошибок, а специальный класс java.io.Console. Помимо правильного определения кодировки, этот класс обладает удобными методами для чтения данных из консоли:
Код
Console con = System.console();
String login = con.readLine("login: ");
char[] password = con.readPassword("password: ");
con.printf("Hello %s!", login);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)