Чтение символов Юникода в Java - PullRequest
3 голосов
/ 02 сентября 2010

Я немного новичок в Java, когда я назначаю строку Unicode для

  String str = "\u0142o\u017Cy\u0142";
  System.out.println(str);

  final StringBuilder stringBuilder = new StringBuilder();
  InputStream inStream = new FileInputStream("C:/a.txt");
  final InputStreamReader streamReader = new InputStreamReader(inStream, "UTF-8");
  final BufferedReader bufferedReader = new BufferedReader(streamReader);
  String line = "";
  while ((line = bufferedReader.readLine()) != null) {
      System.out.println(line);
      stringBuilder.append(line);
  }

Почему результаты отличаются в обоих случаях, файл a.txt также содержит одну и ту же строку. но когда я печатаю вывод файла, он печатает z\u0142o\u017Cy\u0142 вместо фактических символов Юникода. Любая идея, как мне это сделать, если я хочу, чтобы содержимое файла также печаталось при печати строки.

Ответы [ 8 ]

5 голосов
/ 02 сентября 2010

Java интерпретирует экранированные символы Юникода, такие как ваши \u0142, которые находятся в исходном коде, как если бы вы фактически ввели этот символ (латинская буква L со штрихом) в исходный код.Java не интерпретирует кодировку Unicode, которую он читает из файла.

Если вы берете свой String str = "\u0142o\u017Cy\u0142"; и записываете его в файл a.txt из вашей программы Java, затем откройте файлв редакторе вы увидите сами символы в файле, , а не последовательность \ uNNNN.

Если затем взять исходную опубликованную программу и прочитать , что a.txt файл, вы должны увидеть, что вы ожидали.

5 голосов
/ 02 сентября 2010

Ваш код должен быть правильным, но я предполагаю, что файл "a.txt" содержит не символы Unicode, закодированные с помощью UTF-8, а экранированную строку "\ u0142o \ u017Cy \ u0142".

Пожалуйста, проверьте правильность текстового файла, используя редактор с поддержкой UTF-8, такой как последние версии Notepad или Notepad ++ для Windows. Или отредактируйте его в своем любимом шестнадцатеричном редакторе - он не должен содержать обратной косой черты.

Я пробовал использовать «€» в качестве содержимого файла в кодировке UTF-8, и он печатается правильно. Обратите внимание, что не все символы Unicode могут быть напечатаны, в зависимости от кодировки вашего терминала (на самом деле хлопот в Windows) и шрифта.

2 голосов
/ 30 сентября 2015

Вы можете использовать Apache Commons Lang .

import org.apache.commons.lang3.StringEscapeUtils;

// open the file as ASCII, read it into a string, then
String escapedStr; // = "\u0938\u093e\u0935\u0928@\u0928\u093f\u0915\u094d\u0938\u0940.\u092d\u093e\u0930\u0924"
// (to include such a string in a Java program you would have to double each \)

String hindiStr = StringEscapeUtils.unescapeJava( escapedStr );

System.out.println(hindiStr);
2 голосов
/ 02 сентября 2010

Звучит так, как будто ваш файл буквально содержит текст z\u0142o\u017Cy\u014, т. Е. Содержит escape-последовательности Unicode.

Возможно, есть библиотека для их декодирования, но вы можете сделать это самостоятельно - согласно Спецификации языка Java escape-последовательность всегда имеет форму \uxxxx, так что вы можете получить 4-значный шестнадцатеричный код значение xxxx для символа, преобразовать его в целое число с Integer.parseInt, преобразовать его в символ и, наконец, заменить всю последовательность \uxxxx на символ.

1 голос
/ 03 сентября 2010

Итак, вы хотите отменить код Unicode? Для этого нет общедоступного API. У java.util.Properties есть метод loadConvert(), который делает именно это, но это private. Проверьте исходный код Java на случай, если вы хотите использовать его повторно. Это делает преобразование простым анализом. Я не стал бы использовать регулярные выражения для этого, так как это слишком подвержено ошибкам в очень специфических обстоятельствах.

Или, возможно, вам следует использовать java.util.Properties или его аналог i18n java.util.ResourceBundle с файлом .properties вместо простого .txt файла.

Смотри также:

0 голосов
/ 28 ноября 2010

Я разместил Java-код в unescape («descape»?), Таких вещах и многих других в этом ответе .

0 голосов
/ 03 сентября 2010

Вы использовали FileInputStream и читатель байт-кода, а не символьный. Попробуйте использовать FileReader вместо

что-то вроде:

BufferedReader inputStream = новый BufferedReader (новый FileReader ("C: /a.txt"));

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

0 голосов
/ 02 сентября 2010

Я думаю, что это просто "UTF8", а не "UTF-8".

Здесь я увидел это: Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...