UTF-8 не может правильно передавать строки японских символов (хирагана и катакана) в качестве аргумента

Например, нужный мне файл находится по этому пути, и он будет передан в качестве аргумента:

"C:\Users\user.name\docs\jap\あああいいいうううえええおおおダウンロード\filename.txt"

Я использовал этот код для декодирования символов:

String new_path = new String(args[0].getBytes("Shift_JIS"), StandardCharsets.UTF_8);
System.out.println(new_path);

Однако на выходе получается:

C:\Users\user.name\docs\jap\あああい�?�?�?�?�?えええおおお�?ウンロード\filename.txt

Некоторые символы не декодированы должным образом. Я уже изменил кодировку текста и кодировку консоли на UTF-8, но это все равно не сработало.

Но если бы я просто печатал его регулярно, он отображался нормально.

System.out.println("C:\\Users\\user.name\\docs\\jap\\あああいいいうううえええおおおダウンロード\\filename.txt");

который отображает:

C:\Users\user.name\docs\jap\あああいいいうううえええおおおダウンロード\filename.txt

Подскажите, пожалуйста, как читать других персонажей, это действительно будет большим подспорьем. Спасибо!


person crimson_scythe    schedule 18.01.2019    source источник
comment
Возможный дубликат как использовать китайский и японский символы как строку в java?   -  person Echoinacup    schedule 18.01.2019
comment
попробуйте использовать это String path = "C:\\Users\\user.name\\docs\\jap\\あああいいいうううえええおおおダウンロード\filename.txt"; String new_path = new String(path.getBytes(), StandardCharsets.UTF_8);   -  person Doctor Who    schedule 18.01.2019
comment
Вы говорите String.getBytes предоставить вам байты в кодировке Shift_JIS, а затем вы сообщаете конструктору String, что кодировка байтов - UTF-8 - это явно неверно. Вы должны просто иметь возможность использовать строку args [0] напрямую без какого-либо преобразования.   -  person greg-449    schedule 18.01.2019
comment
@suneel его следует передать как аргумент, таким образом используя args [0]   -  person crimson_scythe    schedule 18.01.2019
comment
@ greg-449 Я попытался просто напечатать строку args [0] напрямую, однако на выходе получилось: C: \ Users \ user.name \ docs \ jap \ 縺 ゅ ≠ 縺 ゅ > 縺 � 縺 � 縺 � 縺 � 縺 � 縺 医 ∴ 縺 医 ♀ 翫 ♀ 繝 � 繧 ヲ 繝 ウ 繝 ュ 繝 シ 噂 filename.txt   -  person crimson_scythe    schedule 18.01.2019
comment
Затем что-то испортило строку до того, как ее получит ваша программа. Придется детально исследовать, что происходит со строкой. Тестирование здесь запуска программы в Eclipse отлично работает только с args [0].   -  person greg-449    schedule 18.01.2019
comment
String new_path = args[0]; должно хватить, преобразование кодировки платформы в java String (всегда Unicode) уже выполнено. System.out.println преобразует Unicode String в кодировку платформы.   -  person Joop Eggen    schedule 18.01.2019
comment
SideNote: назовите переменные в верблюжьем регистре (первая буква в нижнем регистре, а каждое последующее слово - в верхнем регистре: new_path - ›newPath)   -  person Lino    schedule 18.01.2019


Ответы (1)


public static void main(String[] args) throws UnsupportedEncodingException {
    // it is your code
    String newPath = new String(args[0].getBytes("Shift_JIS"), StandardCharsets.UTF_8);
    System.out.println(newPath);
    // instead of your code
    newPath = args[0];
    System.out.println(newPath);
}

возможно, вы сможете показать "あ あ あ い い い う う え え え お お お ダ ウ ロ ー ド".

если вы создаете объект String с байтовым массивом и соответствующей кодировкой, вы можете преобразовать его в любую для него кодировку.

person kiho.kim    schedule 18.01.2019
comment
Я пробовал ваш код, но он вернул: C: \ Users \ user.name \ docs \ jap \ 縺 ゅ ≠ 縺 ゅ > 縺 � 縺 � 縺 � 縺 � 縺 � 縺 医 ∴ 縺 医 ♀ 縺 翫 ♀ 繝 � 繧 ヲ 繝 ウ 繝 ュ 繝 シ 繝 噂 filename.txt - person crimson_scythe; 18.01.2019
comment
Использую КОРЕЙСКИЕ окна. но я выполняю свой код E: \ temp \ 縺 ゅ ≠ 縺 ゅ ›java UTF8PathTest あ あ あ い う う え え え お お ダ ウ ン ロ ー ド ??????????????????????? ???????? _? E ?????? h あ あ あ い い い う う う え え え お ダ ウ ン ロ? ド - person kiho.kim; 18.01.2019
comment
Вы использовали Eclipse? если да, то какую кодировку вы использовали? - person crimson_scythe; 21.01.2019