Расширенная Ascii не работает в консоли! - PullRequest
3 голосов
/ 24 февраля 2011

Например System.out.println ( "╚"); отображается как?, то же самое относится и к System.out.println ("\ u255a");

Почему это не работает? Stdout действительно поддерживает эти символы, поэтому я не понимаю.

Ответы [ 3 ]

2 голосов
/ 24 февраля 2011

В командной строке Windows по умолчанию используются старые OEM-кодировки DOS. System.out использует системную кодировку по умолчанию, которая будет кодировкой Windows "ANSI". Однако System.console() определяет кодировку консоли.

U + 255A (╚), скорее всего, будут поддерживаться кодовыми страницами OEM, поскольку эти диапазоны использовались для акцентированных символов в Windows.

Вы можете прочитать больше здесь , здесь , здесь и здесь .

Лично я бы избежал опции -Dfile.encoding с кодовой страницей 65001, поскольку это вызывает непреднамеренные побочные эффекты как в консоли (пакетные файлы перестают работать), так и в Java ( ошибки ).

2 голосов
/ 24 февраля 2011

См. этот вопрос .Если для Java по умолчанию используется кодировка символов не UTF-8 - как это имеет место в Windows и OS X, но не в Linux - тогда символы, которые не могут быть закодированы, преобразуются в знаки вопроса.Вы можете передать правильный ключ (-Dfile.encoding=UTF-8 на некоторых терминалах, но у меня нет окна Windows передо мной) в командную строку JVM, или вы можете установить переменную окружения.Определить, каким это должно быть, может быть невозможно, но если вы знаете, что вы всегда будете работать на консоли Win32, например, вы можете выбрать Charset для явного кодирования символов перед записью их в стандартный выводили вы можете напрямую написать нужные байты.

0 голосов
/ 24 февраля 2011

В случае, если вы используете Windows, консоль - это не UTF-8, а UTF-16, которая является той же нативной кодировкой, которую использует Java, поэтому вы должны иметь возможность печатать строки широких символов напрямую.

Я не программист на Java, но в случае C вам нужно вызвать _setmode() в специальном режиме _O_U16TEXT, прежде чем печать UTF-16 будет работать.

Если вы хотите печатать многобайтовые строки символов, вместо этого вы можете установить консоль Windows на UTF-8 из командной строки с помощью chcp 65001 или программно из Win32 API SetConsoleOutputCP(), но остерегайтесь ошибки, где WriteFile() возвращает число записанные символы вместо количества записанных байтов, как задокументировано. Эта ошибка приводит к повреждению UTF-8 на консоли Windows из-за Perl, PHP и Ruby. Я верю, что даже MSVCRT даже становится жертвой.

Удачи!

...