Неправильная печать неанглийских символов с Java

1
задан Paul 16 January 2019 в 11:53
поделиться

1 ответ

  • System.in/out будет использовать набор символов Windows по умолчанию.
  • Java String будет использовать Юникод для внутреннего использования.
  • FileReader / FileWriter - это старые служебные классы, которые используют набор символов по умолчанию, поэтому они предназначены только для непереносимых локальных файлов.

Ошибка, которую вы видели, была специальным символом в виде двухбайтовой последовательности UTF-8, но каждый (специальный UTF-8) байт интерпретировался как однобайтовая кодировка по умолчанию, но с отсутствующим значением, следовательно, дважды ? замена.

  • Требуется, чтобы символ вводился в System.in в кодировке по умолчанию.
  • Затем строка была преобразована из кодировки по умолчанию.
  • Запись его в файл в UTF-8 должна указывать UTF-8.

Следовательно:

    BufferedReader stdinReader = new BufferedReader(new InputStreamReader(System.in));
    String[] stdinData = readLines(stdinReader);
    printToFile(stdinData, "stdin_out.txt");

    Path path = Paths.get("testinput-utf8.txt");
    List<String> lines = Files.readAllLines(path); // Here the default is UTF-8!

    Path path = Paths.get("testinput-winlatin1.txt");
    List<String> lines = Files.readAllLines(path, "Windows-1252");

    Files.write(lines, Paths.get("file_out.txt"), StandardCharsets.UTF_8);

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

System.out.println("Hiragana letter Wo '\u3092'."); // Either を or ?.

Видя ? преобразование в кодировку системы по умолчанию не смог доставить. を - это U + 3092, u-кодированный как ASCII с \ u3092.

Чтобы создать текст UTF-8 под Windows:

Files.write(Paths.get("out-utf8.txt"),
    "\uFEFFHiragana letter Wo '\u3092'.".getBytes(StandardCharsets.UTF_8));

Здесь я использую уродливый (обычно ненужный) маркерный символ спецификации \uFEFF (пробел нулевой ширины), который позволит блокноте Windows распознавать текст в UTF-8.

0
ответ дан Joop Eggen 16 January 2019 в 11:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: