Java → Консольная кодировка в Java

Авг 13, 2011

Кракозябры в Java
Любой начинающий программист хоть раз, но сталкивался с проблемой вывода кириллицы на консоль. Пока вы выводите английские буквы, вас она не коснется, но стоит вам попытаться вывести русский текст, как в ответ получите нечитабельные кракозябры на консоли.

Дело в том, что Java по умолчанию использует кодировку UTF-16, которая для каждого символа выделяет 2 байта, в то время как консоль Windows каждому символу отводит 1 байт и использует устаревшую кодировку cp866. Почему устаревшую? Да потому, что UTF-16 (Юникод) поддерживает 65536 символов, а cp866 всего 256 символов, как говориться - почувствуй разницу.

Выбор UTF-16 очевиден: java универсальный язык, который должен также хорошо работать как у англичанина, так и у китайца. А как вы знаете, китайский алфавит состоит не из 26 символов, и отнюдь не из 256 символов. Как вы могли заметить, такая проблема, в большинстве случаев, возникает у пользователей операционной системы семейства Windows.

Решение

Самое простое решение, которое я встречал, это дописать в программу следующий код:

System.setOut(new PrintStream(System.out, true, "cp866"));
System.setErr(new PrintStream(System.err, true, "cp866"));


Таким образом, мы создаем новый поток стандартного вывода и поток вывода ошибок из стандартных потоков, с нужной нам кодировкой cp866, а затем устанавливаем их как стандартные потоки вывода. Необходимо также учесть, что этот код должен идти до того, как вы начнете выводить русский текст на консоль, используя System.out.println().

Девушки постоянно смотрят Дом 2 и тем самым заставляют нас, мужиков, смотреть это "реалити-шоу". Каждый день они ждут вечера, чтобы переключить телевизор на канал ТНТ. И нам приходилось смотреть его не по своей воли, но теперь это можно изменить. Благодаря сайту, на котором происходит бесплатная дом 2 онлайн трансляция девушка сможет смотреть реалити-шоу, пока нас нет дома, тем самым оставив вечер для более приятных вещей.

Post to Twitter

Похожие статьи:

  1. Парсер HTML в Java (jsoup)

Комментарии (3)

  1. avatar

    ddark008
    Март 27th, 2012 at 16:31 #

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

  2. avatar

    Евгений
    Август 12th, 2012 at 19:37 #

    К сожалению не помогло, вот код программы:

    // Тип double
    /* Страница 75 */

    class Programma8
    {
    public static void main(String args[])
    {
    double evro, dolar, funts; //

    evro = 51.10;
    dolar = 32.75;
    funts = 60.23;

    System.setOut(new PrintStream(System.out, true, «cp866″));
    System.setErr(new PrintStream(System.err, true, «cp866″));

    System.out.println(evro + «Опачки»);
    System.out.println(dolar);
    System.out.println(funts);
    System.out.println(«»);
    }
    }

    Вывод при компиляции:
    e:\Java\Files\book>javac Programma8.java
    Programma8.java:14: error: cannot find symbol
    System.setOut(new PrintStream(System.out, true, «cp866″));
    ^
    symbol: class PrintStream
    location: class Programma8
    Programma8.java:15: error: cannot find symbol
    System.setErr(new PrintStream(System.err, true, «cp866″));
    ^
    symbol: class PrintStream
    location: class Programma8
    2 errors

    ————————————-
    Java учу первую неделю по книге Шилдт’а «Полное руководство»

  3. avatar

    Евгений
    Август 12th, 2012 at 19:42 #

    Вот нормальная ссылка на гит хаб.

    https://gist.github.com/3332345

Ваш комментарий

Rambler's Top100 Яндекс.Метрика