powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / И снова русские буквы
10 сообщений из 10, страница 1 из 1
И снова русские буквы
    #38285888
diverM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем,
Вроде как старая тема и обсуждалась миллион раз, но все равно есть вопросы.
Есть небольшое консольное приложение и вывод организован через System.out
Со временем понадобилось его локализовать и чтобы сообщения показывались в зависимости от переданной локали -Duser.country=FR -Duser.language=fr. Все сообщения теперь достаются через resourceBundle и осталось только это все правильно вывести в консоль.
Вот тут и начинаются траблы с кракозябрами и ? вместо букв.
В зависимости от настроек Windows юзера у него может быть разная дефалтовая кодировка в консоле - 437 для FR,US и 866 для RU и т.д. Допустим, я US юзер и у меня стоит в консоле 437 и я хочу вывести сообщения на русском(передавая аргументы -Duser.country=RU -Duser.language=ru). Меняем все System.out на System.console().writer и все равно получаем кракозябры. Нам необходимо еще переключить кодировку консоли на 866(chcp 866) и тогда мы увидим русские буквы.
И похожая обратная ситуация - RU user и в дефолтовой консоле 866 и хотим вывести сообщение на французском(передавая аргументы -Duser.country=FR -Duser.language=fr). Чтобы сообщение правильно отобразилось(System.console().writer) нам необходимо переключить консоль на 437.
Я раньше думал, что System.console умеет распознавать автоматически, но видимо нет. Соответственно, вопрос - можно ли это сделать автоматически, т.к. языков для суппорта много и не хочется помнить какой язык какую кодировку использует в консоле по умолчанию.

Ну и второй вопрос по установке стрима для System.out. Хотелось бы оставить текущий System.out в коде и не менять его на System.console().writer. Теоретически, это можно сделать через System.setOut, но тут нам нужен PrintStream, а System.console().writer дает PrintWriter. Соответсвенно нам нужен враппер, типа WriterOutputStream из apache commons io и тогда мы можем сделать что-то типа System.setOut(new PrintStream(new WriterOutputStream(System.console().writer()), true))
Но такой подход не всегда работает: если пользователь US(437 в консоле) и хочет видеть на французском, то System.out нормально отображает все спец символы в сообщении. Если же мы пытаемся показать ссобщение на русском, то System.out показывает кракозябры и переключение на 866 кодировку в консоле не помогает. Что здесь не так?
...
Рейтинг: 0 / 0
И снова русские буквы
    #38286019
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
diverMЧто здесь не так?Нужно поменять шрифт CMD на Lucida Console
...
Рейтинг: 0 / 0
И снова русские буквы
    #38286021
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
diverM,

И поставить кодировку cp1251, а не cp866.
...
Рейтинг: 0 / 0
И снова русские буквы
    #38286137
diverM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,
Пробовал я это все делать в самом начале и ничего не помогало.
А даже если бы и помогло, то возврат к первому моему вопросу как это сделать автоматически.
А то получается, что пользователь при выборе языка должен помнить на какую кодировку ему надо переключаться.
...
Рейтинг: 0 / 0
И снова русские буквы
    #38286203
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
diverMА то получается, что пользователь при выборе языка должен помнить на какую кодировку ему надо переключаться.Попробуйте задать кодировку Unicode:
Код: plaintext
CMD /U /K CHCP 65001
...
Рейтинг: 0 / 0
И снова русские буквы
    #38287385
diverM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,
65001 тоже не помогает. при этом даже System.console().writer() выводит ?????
...
Рейтинг: 0 / 0
И снова русские буквы
    #38289359
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
diverM65001 тоже не помогает Создал файл в кодировке UTF-8:


Вывел в командной строке содержимое файла (растровый шрифт):


После изменения шрифта окна командной строки на Lucida console:

Все работает.
...
Рейтинг: 0 / 0
И снова русские буквы
    #38289366
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
diverMНу и второй вопрос по установке стрима для System.out. Хотелось бы оставить текущий System.out в коде и не менять его на System.console().writer.
Код: java
1.
PrintStream ps = new PrintStream(System.out, true, "UTF-8");
...
Рейтинг: 0 / 0
И снова русские буквы
    #38291143
diverM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmandiverMНу и второй вопрос по установке стрима для System.out. Хотелось бы оставить текущий System.out в коде и не менять его на System.console().writer.
Код: java
1.
PrintStream ps = new PrintStream(System.out, true, "UTF-8");


упростим задачу - пусть локализованная строка уже вытянута из ресурса и есть такой код:
String str = "\u041Dастр\u043Eй\u043Aа заверше\u043Dа";
и мы хотим это вывести в консоль при этом там выставив 65001
System.setOut(new PrintStream(System.out, true, "UTF-8"));
System.out.println(str);
в итоге имеем:
Настройка завершеназавершена�шенанаа�

Можно ли отобразить в консоли текст нормально? И вообще возможно ли при этом не выставлять в консоли 65001, а использовать что у юзера стоит по умолчанию(437 или 866)?
...
Рейтинг: 0 / 0
И снова русские буквы
    #38291156
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
diverMМожно ли отобразить в консоли текст нормально?Проблема в символах Юникода. Консоль, по-видимому неправильно
интерпретирует многобайтовые строки (хотя при перенаправлении потока в файл - все ок).diverMиспользовать что у юзера стоит по умолчанию(437 или 866)?С Юникодом обломались. Остается выводить текст указывая конкретную кодовую страницу.
Привожу пример корректного вывода в консоль преобразованного Юникод-текста в кодировке 866:
Код: java
1.
2.
3.
String str = "\u041Dастр\u043Eй\u043Aа заверше\u043Dа";
PrintStream ps = new PrintStream(System.out, true, "cp866");
ps.println(str);

Для определения текущей кодировки консоли нужно вызвать нативную (WinAPI) функцию GetConsoleCP ( через JNI ).
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / И снова русские буквы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]