Если вы используете Windows, это может быть вызвано тем, что кодировка символов консоли («Кодовая страница OEM») отличается от кодировки системы («Кодовая страница ANSI»).
InputStreamReader
без явного параметра кодирования предполагает, что входные данные находятся в кодировке системы по умолчанию, поэтому символы, считываемые из консоли, декодируются неправильно.
Для правильного чтения не-as-ascii символов в консоли Windows необходимо указатьКонсольное кодирование явно при построении InputStreamReader
(требуемый номер кодовой страницы можно найти, выполнив mode con cp
в командной строке):
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in, "CP737"));
Та же проблема относится к выводу, вам нужно создать PrintWriter
с правильной кодировкой:
PrintWriter out = new PrintWrtier(new OutputStreamWriter(System.out, "CP737"));
Обратите внимание , что начиная с Java 1.6 вы можете избежать этих обходных путей, используя Console
объект, полученный из System.console()
.Он предоставляет Reader
и Writer
с правильно настроенной кодировкой, а также некоторые служебные методы.
Однако System.console()
возвращает null
, когда потоки перенаправляются (например, при запуске из IDE).Обходной путь для этой проблемы можно найти в ответе Макдауэлла.
См. Также: