Распечатать символ юникода в java

Отображение символа unicode в java показывает "?" знак. Например, я попытался напечатать «अ». Его unicode номер — U+0905, а HTML-представление — «अ». Приведенные ниже коды печатают "?" вместо символа unicode.

char aa = '\u0905';
String myString = aa + " result" ;
System.out.println(myString); // displays "? result"

Есть ли способ отобразить символ unicode непосредственно из самого unicode без использования чисел unicode? то есть "अ" сохраняется в файле, теперь отображается файл в jsp.


person Redone    schedule 03.07.2017    source источник
comment
Может быть, ваша консоль не может или не настроена для отображения этого символа?   -  person sazzad    schedule 03.07.2017
comment
@sazzad Я пробовал это в методе получения сервлета. Вот и показывает? в браузере.   -  person Redone    schedule 03.07.2017
comment
ваш запрос возвращает utf8?   -  person Scary Wombat    schedule 03.07.2017
comment
Если вы сохраните файл .java или .jsp в utf-8, вы можете использовать в нем символы юникода без кодировки.   -  person rustyx    schedule 03.07.2017


Ответы (4)


Java определяет два типа потоков: байтовые и символьные.

Основная причина, по которой System.out.println() не может отображать символы Unicode, заключается в том, что System.out.println() — это поток байтов, который имеет дело только с младшими восемью битами символа, то есть 16-битными.

Чтобы иметь дело с символами Unicode (16-битный символ Unicode), вы должны использовать поток на основе символов, то есть PrintWriter.

PrintWriter поддерживает методы print() и println(). Таким образом, вы можете использовать эти методы так же, как вы использовали их с System.out.

PrintWriter printWriter = new PrintWriter(System.out,true);
char aa = '\u0905';
printWriter.println("aa = " + aa);
person Mohammed Tamimi    schedule 05.08.2018

попробуйте использовать набор символов utf8 -

        Charset utf8 = Charset.forName("UTF-8");
        Charset def = Charset.defaultCharset();

        String charToPrint = "u0905";

        byte[] bytes = charToPrint.getBytes("UTF-8");
        String message = new String(bytes , def.name());

        PrintStream printStream = new PrintStream(System.out, true, utf8.name());
        printStream.println(message); // should print your character
person Razib    schedule 03.07.2017

Ваша переменная myString содержит совершенно правильное значение. Проблема должна заключаться в выходе из System.out.println(myString), который должен отправить несколько байтов на какой-то вывод, чтобы показать глифы, которые вы хотите увидеть.

System.out - это PrintStream, использующий "кодировку платформы по умолчанию" для преобразования символов в последовательности байтов - возможно, ваша платформа не поддерживает этот символ. Например. на моем компьютере с Windows 7 в Германии кодировка по умолчанию — CP1252, и в этой кодировке нет последовательности байтов, соответствующей вашему символу.

Или, может быть, кодировка правильная, но просто шрифт, который создает графические глифы из символов, не имеет этого символа.

Если вы отправляете свой вывод в окно Windows CMD.EXE, возможно, применимы обе причины.

Но будьте уверены, ваша строка верна, и если вы отправите ее в пункт назначения, который может ее обработать (например, Swing JTextField), она будет отображаться правильно.

person Ralf Kleberhoff    schedule 03.07.2017

Я столкнулся с той же проблемой с Eclipse. Я решил свою проблему, переключив формат кодировки для консоли с ISO-8859-1 на UTF-8. Вы можете сделать это в меню Run/Run Configurations/Common.

https://eclipsesource.com/blogs/2013/02/21/pro-tip-unicode-characters-in-the-eclipse-console/

person mheisters    schedule 18.02.2021