Символы Unicode отображаются как вопросительные знаки в консоли IntelliJ IDEA
Я пытаюсь написать символы Unicode (♠) с помощью System.out, и вместо этого будет напечатан знак вопроса.
Как я могу отображать правильные символы Unicode вместо вопросительных знаков?
Я использую IntelliJ IDEA в Windows и пытаюсь печатать из среды IDE.
Ответы
Ответ 1
Правильно ли настроена кодировка файла? Смотрите, что "Настройки | Кодировки файлов" использует UTF-8. Печать ♠ работает для меня, когда у меня есть кодировка IDE и все файлы, установленные в UTF-8. После изменения кодировки может потребоваться перекомпиляция.
Ответ 2
Небольшое обновление для 2015 года
TL; ответ DR:
Перейдите к Settings
→ Editor
→ File Encodings
→ Project Encoding
и установите его в "UTF-8".
Расширенный ответ:
Причина, по которой он не работает, может быть найден путем размещения точки останова при вызове System.out.print()
. Когда точка останова попадает, вы можете добавить System.out
в Watches
, и вы можете видеть, что System.out.textOut.out.se.cs
установлено на windows-1252
или что-то подобное не подходит.
Настройка, которая волшебным образом работала для меня (я не знаю, почему) находится в Settings
→ Editor
→ File Encodings
→ Project 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" );