Вот мой код:
class Hello{
public static void main(String[] arg)throws Exception{
System.out.println("Hello");
String str = "سلام";
System.out.println(new String(str.getBytes("UTF-8")));
}
}
Компиляция как: javac -encoding UTF8 Hello.java Результат:
C:\Users\Windows\Desktop>java Hello
Hello
ط³ظ„ط§ظ…
chcp показывает: Active code page: 65001
Как я могу отобразить это точно?
С наилучшими пожеланиями
Я не могу воспроизвести это, я попробовал ваш код, и он может отображаться правильно
Почему вы берете строку, преобразуете ее в байты UTF-8 и обратно в строку (возможно, в другой кодировке символов)? Почему бы не просто System.out.println(str);?
@AndyTurner Когда я печатаю только str, то компилируется, но ничего не отображается
@时间只会一直走 Have you please tried in windows command line?
new String(str.getBytes("UTF-8")) возьмет вашу строку, преобразует ее в байты, используя UTF-8, а затем преобразует ее обратно в строку, используя либо UTF-8 (на современных JVM, я думаю, jdk17+), либо используя локальную кодировку вашей платформы. Если это UTF-8, это бессмысленно и производит то же самое, что и просто str. Если это не UTF-8, вы проигрываете игру, и ваша строка становится непоправимо абракадаброй. Что бы ни происходило, не делайте эту часть. Затем ваша строка преобразуется обратно в byte[] в третий раз при отправке на стандартный вывод. Затем ваша ОС преобразует его обратно в строку и печатает.
Просто напечатайте str. Если это ничего не печатает, идите отлаживать его. Что печатает System.out.println(System.getProperty("native.encoding"));?
@rzwitserloot печатает null
@user, значит, вы используете старый JDK. Хорошо, старая версия это System.out.println(Charset.defaultCharset()).
Вывод @rzwitserloot: windows-1256
Я не думаю, что это вообще может обрабатывать персидские символы. Никакой Java-код не мог бы заставить его работать.
@rzwitserloot, тогда что мне делать? Могу ли я обновить свой jdk до более новой версии или что-то еще?
Перед вами случай моджибаке (пример на Python для его универсальной понятности): "سلام".encode('utf-8').decode('cp1256') возвращает 'ط³ظ„ط§ظ…'. Я предполагаю, что System.out.println("سلام"); или System.out.println(str); должны работать вместо System.out.println(new String(str.getBytes("UTF-8")));…
@JosefZ Я пытался System.out.println("سلام");, но отображается странный символ




Ваш код в порядке, но у вас есть две проблемы:
Используя ваш образец приложения, вот как выходные данные были отображены в моем окне командной строки с использованием шрифта Courier New, который поддерживает символы фарси:
Обратите внимание, что символы отрисовывались правильно, но в обратном порядке.
Может быть простой обходной путь, чтобы заставить символы правильно отображать текст справа налево в окне командной строки, но в любом случае лучший альтернативный подход — вместо этого использовать реализацию командной строки, предоставляемую утилитой терминала Microsoft.
Если вы это сделаете, вывод вашего приложения будет отображаться правильно без необходимости внесения каких-либо изменений в конфигурацию:
Примечания:
Windows Terminal — это современное хост-приложение для уже любимых вами оболочек командной строки, таких как Command Prompt, PowerShell и bash. (через подсистему Windows для Linux (WSL)). К его основным особенностям относятся несколько вкладок, панелей, поддержка символов Unicode и UTF-8, графический процессор ускоренный движок рендеринга текста и возможность создавать собственные темы и настраивайте текст, цвета, фон и ярлыки.
Посмотрите, поможет ли это.