Чтение текстовых файлов Unicode с помощью java

На самом деле простой вопрос. Мне нужно прочитать текстовый файл Unicode в программе Java.

Я привык использовать простой текст ASCII с комбинацией BufferedReader FileReader, которая явно не работает :(

Я знаю, что могу прочитать строку "традиционным" способом, используя буферизованный считыватель, а затем преобразовать ее, используя что-то вроде:

temp = new String(temp.getBytes(), "UTF-16");

Но есть ли способ обернуть Reader в «Конвертер»?

РЕДАКТИРОВАТЬ: файл начинается с FF FE


person Ron Tuffin    schedule 11.06.2009    source источник


Ответы (6)


вы бы не обернули Reader, вместо этого вы бы обернули поток, используя InputStreamReader. Затем вы можете обернуть это своим BufferedReader, который вы используете в настоящее время.

BufferedReader in = new BufferedReader(new InputStreamReader(stream, encoding));
person objects    schedule 11.06.2009
comment
Я хочу читать буквы иврита, что бы я заменил на кодировку? - person CodyBugstein; 30.10.2013
comment
чтобы ответить на мой собственный вопрос, это UTF-8 - person CodyBugstein; 30.10.2013
comment
«Конструктор BufferedReader (InputStreamReader) не определен»? - person Squareoot; 15.12.2016

Проверьте https://docs.oracle.com/javase/1.5.0/docs/api/java/io/InputStreamReader.html.

Я бы прочитал исходный файл с чем-то вроде:

Reader in = new InputStreamReader(new FileInputStream("file"), "UTF-8"));
person Macarse    schedule 11.06.2009

Некоторые примечания:

  • кодировка «UTF-16» может читать файлы в кодировке с прямым порядком байтов или с прямым порядком байтов, помеченные BOM; см. здесь список Java 6 кодировок; явно не указано, какой порядок следования байтов будет использоваться при записи с использованием «UTF-16» - похоже, он имеет прямой порядок байтов, поэтому вы можете использовать «UnicodeLittle» при сохранении данных.
  • будьте осторожны при использовании методов кодирования/декодирования класса String, особенно с помеченной кодировкой переменной ширины, такой как UTF-16 - использовать их только для целых данных
  • как уже говорили другие, часто лучше читать символьные данные, обернув ваш InputStream с помощью InputStreamReader; вы можете объединить ваш ввод в одну строку с помощью StringBuilder или аналогичного буфер.
person McDowell    schedule 11.06.2009
comment
Спасибо за ссылку на типы кодировок. Я нашел правильный для меня. - person Roger C S Wernersson; 26.03.2010

Я бы рекомендовал использовать UnicodeReader из API данных Google, см. этот ответ на аналогичный вопрос. Он автоматически определит кодировку по метке порядка байтов (BOM).

Вы также можете рассмотреть BOMInputStream в Apache Commons IO, который в основном делает то же самое, но не охватывает все альтернативные версии спецификации.

person stenix    schedule 22.10.2015

Мне просто нужно было добавить «UTF-8» к созданию InputStreamReader, и специальные символы можно было увидеть сразу.

InputStreamReader istreamReader = new InputStreamReader(inputStream,"UTF-8");
BufferedReader bufferedReader = new BufferedReader(istreamReader);
person Jorge Ros    schedule 02.11.2018

person    schedule
comment
Является ли класс сканера специфичным для юникода? Просто читая код (и не зная о таких вещах), трудно установить, действительно ли это отвечает на вопрос. Для вопросов, где OP может потребоваться некоторое концептуальное понимание, а также код, полезно включить в свой ответ краткое текстовое описание почему код работает. Такое описание было бы полезно здесь. Кроме того, я отредактировал ваш пост, чтобы поместить код в разметку кода. Пожалуйста, делайте то же самое в будущем, так его будет намного легче читать. Добро пожаловать в StackOverflow! - person BradleyDotNET; 19.05.2014