Символы Unicode отображаются как вопросительные знаки в консоли IntelliJ IDEA

Я пытаюсь написать символы Unicode (♠) с помощью System.out, и вместо этого будет напечатан знак вопроса.

Как я могу отображать правильные символы Unicode вместо вопросительных знаков?

Я использую IntelliJ IDEA в Windows и пытаюсь печатать из среды IDE.

Ответ 1

Правильно ли настроена кодировка файла? Смотрите, что "Настройки | Кодировки файлов" использует UTF-8. Печать ♠ работает для меня, когда у меня есть кодировка IDE и все файлы, установленные в UTF-8. После изменения кодировки может потребоваться перекомпиляция.

Ответ 2

Небольшое обновление для 2015 года

TL; ответ DR:

Перейдите к SettingsEditorFile EncodingsProject Encoding и установите его в "UTF-8".

Расширенный ответ:

Причина, по которой он не работает, может быть найден путем размещения точки останова при вызове System.out.print(). Когда точка останова попадает, вы можете добавить System.out в Watches, и вы можете видеть, что System.out.textOut.out.se.cs установлено на windows-1252 или что-то подобное не подходит.

Настройка, которая волшебным образом работала для меня (я не знаю, почему) находится в SettingsEditorFile EncodingsProject Encoding. Вам нужно установить это на "UTF-8".

Затем символы юникода отображаются на консоли правильно, а еще один быстрый просмотр с отладчиком показывает, что значение System.out.textOut.out.se.cs магически превратилось в UTF-8.

Я говорю "волшебным образом", потому что не вижу, как и почему параметр редактора должен влиять на набор символов, который создается System.out при запуске/отладке приложения. Если кто-то знает, какова логика этого, пожалуйста, скажите!

Ответ 3

System.out использует стандартную кодировку базовой операционной системы, которая обычно представляет собой ISO-8859-1 или UTF-8. Первое - это то, что у меня есть с кодировкой 1252 под XP.

Это в окне CMD.EXE или внутри IDE?

Ответ 4

Если вы в конечном итоге хотите напечатать широкий диапазон символов Юникода в стандартной командной строке Windows, есть небольшая работа. По умолчанию растровый шрифт не поддерживает символы, и приложениям обычно требуется вызывать API консоли Unicode для их рендеринга. В Java нет - он сначала кодирует символы в собственный набор символов (процесс с потерями), а затем испускает их с помощью вызова ANSI. Вы можете прочитать этот пост в блоге, если хотите детали gory.

Ответ 5

У вас есть соответствующие шрифты, установленные на вашем компьютере? Значок вопроса появляется, когда у вас нет шрифтов для выводимых символов.

Также вы выводите, выполняя System.out.println("")? Если это так, нужно просто установить шрифты.

Если вы пытаетесь записать в System.out из вашей программы, это отличается. Вы должны использовать OutputStreamWriter, который является символьным потоком. Вы не можете просто написать поток, ориентированный на байты, такой как OutputStream.

Посмотрите ссылку API и класс для OutputStreamWriter и подклассов, таких как PrintWriter. Вы его создаете, предоставляя локаль конструктора. Например,

PrintWriter pw = новый PrintWriter (System.out, "UTF-8" );