Не удалось прочитать японские иероглифы через System.in

Код:

Scanner sc = new Scanner(System.in);
System.out.println("Enter Name : ");
String name = sc.nextLine();
System.out.println(name);

String encoding = "UTF-8";
System.out.println(new String(name.getBytes(encoding), "euc-jp"));
System.out.println(new String(name.getBytes(encoding), "Shift_JIS"));
System.out.println(new String(name.getBytes(encoding), "ISO-2022-JP"));
System.out.println(new String(name.getBytes(encoding), "ISO8859-1"));

Вход:

Введите имя: たなかです

Выход:

�F�Q���N�@

鐃�鐃�鐃緒申鐃�鐃�

�ソスF�ソスQ�ソス�ソス�ソスN�ソス@

���F���Q���������N���@

�F�Q���N�@

Ни один из них не читаем по-японски. Я также пробовал InputStreamReader и DataInputStream с Byte[].


person TanakaSakana    schedule 28.03.2016    source источник
comment
Возможный дубликат как использовать китайский и японский символы как строка в java?   -  person sinclair    schedule 28.03.2016
comment
System.out.println(name) должно работать нормально - остальные строки не имеют особого смысла. Проблема, вероятно, в том, что ваша консоль не может печатать эти символы. См. демонстрацию.   -  person assylias    schedule 28.03.2016
comment
Можете ли вы показать нам, как используется переменная кодирования bdw?   -  person Sasi Kathimanda    schedule 28.03.2016
comment
кодировка должна быть = UTF-8, я пытался скомпилировать с кодировкой и запустить в консоли. оба не работают   -  person TanakaSakana    schedule 28.03.2016
comment
Вместо чтения ввода работает ли печать жестко закодированной строки японских символов? Например. System.out.println("頑張ります!"); @TanakaSakana   -  person Tacocat    schedule 28.03.2016
comment
println работает, печатает как есть   -  person TanakaSakana    schedule 28.03.2016
comment
Я думаю, что это должна быть проблема с входным потоком, однако новый сканер (System.in, UTF-8) не работает.   -  person TanakaSakana    schedule 29.03.2016
comment
Можете ли вы опубликовать, как должен выглядеть вывод, чтобы мы могли сравнить?   -  person user1803551    schedule 24.07.2016


Ответы (2)


Как правильно напечатать строку для консоли с вашим кодом

name.getBytes(encoding) в вашем коде получит необработанное байтовое представление String name с кодировкой UTF-8. Поэтому, когда вы набираете «た な か で す» в консоли, вы получаете массив байтов {0xE3, 0x81, 0x9F, 0xE3, 0x81, 0xAA, 0xE3, 0x81, 0x8B, 0xE3, 0x81, 0xA7, 0xE3, 0x81, 0x99}.

Это представление основано на UTF-8, поэтому единственная кодировка, которую вы можете указать во втором аргументе конструктора String(byte[] bytes, String charsetName), — это UTF-8.

System.out.println(new String(name.getBytes(encoding), "UTF-8"));

Он преобразует массив байтов {0xE3, 0x81, 0x9F, ... } в объект String и правильно выводит на консоль.

Как получить внутреннее представление строки в виде массива байтов

String использует кодировку UTF-16 для внутреннего текстового представления (см. https://docs.oracle.com/javase/8/docs/technotes/guides/intl/overview.html для подробностей).

Таким образом, вы должны использовать name.getBytes("UTF-16"), когда хотите получить массив байтов, такой же, как и внутреннее текстовое представление. Вы можете преобразовать его в объект String с помощью System.out.println(new String(name.getBytes("UTF-16"), "UTF-16"));.

person SATO Yusuke    schedule 12.05.2020

в вашем следующем фрагменте кода есть небольшая проблема, вы используете одну и ту же кодировку для разных наборов символов,

String encoding = System.getProperty("file.encoding"); 
System.out.println(new String(name.getBytes(encoding), "UTF-8"));

если вы хотите напечатать японские символы, используя разные кодировки, используйте это

 System.out.println(new String(name.getBytes("euc-jp"), "euc-jp"));
 System.out.println(new String(name.getBytes("Shift_JIS"), "Shift_JIS"));
 System.out.println(new String(name.getBytes("ISO-2022-JP"), "ISO-2022-JP"));
 System.out.println(new String(name.getBytes("ISO8859-1"), "ISO8859-1"));
person Sasi Kathimanda    schedule 28.03.2016