|
|
|
И снова русские буквы
|
|||
|---|---|---|---|
|
#18+
Привет всем, Вроде как старая тема и обсуждалась миллион раз, но все равно есть вопросы. Есть небольшое консольное приложение и вывод организован через 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 кодировку в консоле не помогает. Что здесь не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 23:01:28 |
|
||
|
И снова русские буквы
|
|||
|---|---|---|---|
|
#18+
diverMЧто здесь не так?Нужно поменять шрифт CMD на Lucida Console ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 01:20:30 |
|
||
|
И снова русские буквы
|
|||
|---|---|---|---|
|
#18+
diverM, И поставить кодировку cp1251, а не cp866. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 01:21:28 |
|
||
|
И снова русские буквы
|
|||
|---|---|---|---|
|
#18+
Usman, Пробовал я это все делать в самом начале и ничего не помогало. А даже если бы и помогло, то возврат к первому моему вопросу как это сделать автоматически. А то получается, что пользователь при выборе языка должен помнить на какую кодировку ему надо переключаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 07:24:14 |
|
||
|
И снова русские буквы
|
|||
|---|---|---|---|
|
#18+
diverMА то получается, что пользователь при выборе языка должен помнить на какую кодировку ему надо переключаться.Попробуйте задать кодировку Unicode: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 09:10:03 |
|
||
|
И снова русские буквы
|
|||
|---|---|---|---|
|
#18+
Usman, 65001 тоже не помогает. при этом даже System.console().writer() выводит ????? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 19:51:27 |
|
||
|
И снова русские буквы
|
|||
|---|---|---|---|
|
#18+
diverM65001 тоже не помогает Создал файл в кодировке UTF-8: Вывел в командной строке содержимое файла (растровый шрифт): После изменения шрифта окна командной строки на Lucida console: Все работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2013, 05:02:19 |
|
||
|
И снова русские буквы
|
|||
|---|---|---|---|
|
#18+
diverMНу и второй вопрос по установке стрима для System.out. Хотелось бы оставить текущий System.out в коде и не менять его на System.console().writer. Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2013, 05:51:58 |
|
||
|
И снова русские буквы
|
|||
|---|---|---|---|
|
#18+
UsmandiverMНу и второй вопрос по установке стрима для System.out. Хотелось бы оставить текущий System.out в коде и не менять его на System.console().writer. Код: java 1. упростим задачу - пусть локализованная строка уже вытянута из ресурса и есть такой код: String str = "\u041Dастр\u043Eй\u043Aа заверше\u043Dа"; и мы хотим это вывести в консоль при этом там выставив 65001 System.setOut(new PrintStream(System.out, true, "UTF-8")); System.out.println(str); в итоге имеем: Настройка завершеназавершена�шенанаа� Можно ли отобразить в консоли текст нормально? И вообще возможно ли при этом не выставлять в консоли 65001, а использовать что у юзера стоит по умолчанию(437 или 866)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2013, 01:57:55 |
|
||
|
И снова русские буквы
|
|||
|---|---|---|---|
|
#18+
diverMМожно ли отобразить в консоли текст нормально?Проблема в символах Юникода. Консоль, по-видимому неправильно интерпретирует многобайтовые строки (хотя при перенаправлении потока в файл - все ок).diverMиспользовать что у юзера стоит по умолчанию(437 или 866)?С Юникодом обломались. Остается выводить текст указывая конкретную кодовую страницу. Привожу пример корректного вывода в консоль преобразованного Юникод-текста в кодировке 866: Код: java 1. 2. 3. Для определения текущей кодировки консоли нужно вызвать нативную (WinAPI) функцию GetConsoleCP ( через JNI ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2013, 04:13:33 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38291143&tid=2129200]: |
0ms |
get settings: |
17ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 276ms |
| total: | 397ms |

| 0 / 0 |
