Чтение UTF-8 – маркер спецификации

Я читаю файл через FileReader – файл UTF-8 декодирован (с BOM), теперь моя проблема: я прочитал файл и вывел строку, но, к сожалению, выводится также маркер спецификации. Почему это происходит?

fr = new FileReader(file); br = new BufferedReader(fr); String tmp = null; while ((tmp = br.readLine()) != null) { String text; text = new String(tmp.getBytes(), "UTF-8"); content += text + System.getProperty("line.separator"); } 

вывод после первой строки

 ? 

В Java вы должны вручную использовать спецификацию UTF8, если она есть. Это поведение описано в базе данных ошибок Java здесь и здесь . На данный момент не будет никаких исправлений, поскольку он нарушит существующие инструменты, такие как JavaDoc или XML-парсеры. Apache IO Commons предоставляет BOMInputStream для обработки этой ситуации.

Взгляните на это решение: обрабатывайте файл UTF8 с помощью спецификации

Самое простое исправить – это, вероятно, просто удалить полученный из \uFEFF из строки, поскольку он вряд ли появится по какой-либо другой причине.

 tmp = tmp.replace("\uFEFF", ""); 

Также см. Отчет об ошибке в Гуаве

Используйте библиотеку Apache Commons .

Класс: org.apache.commons.io.input.BOMInputStream

Пример использования:

 String defaultEncoding = "UTF-8"; InputStream inputStream = new FileInputStream(someFileWithPossibleUtf8Bom); try { BOMInputStream bOMInputStream = new BOMInputStream(inputStream); ByteOrderMark bom = bOMInputStream.getBOM(); String charsetName = bom == null ? defaultEncoding : bom.getCharsetName(); InputStreamReader reader = new InputStreamReader(new BufferedInputStream(bOMInputStream), charsetName); //use reader } finally { inputStream.close(); } 

Вот как я использую Apache BOMInputStream, он использует блок try-with-resources. Аргумент «false» указывает объекту игнорировать следующие спецификации (мы используем текстовые файлы «Без спецификации» по соображениям безопасности, ха-ха):

 try( BufferedReader br = new BufferedReader( new InputStreamReader( new BOMInputStream( new FileInputStream( file), false, ByteOrderMark.UTF_8, ByteOrderMark.UTF_16BE, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_32BE, ByteOrderMark.UTF_32LE ) ) ) ) { // use br here } catch( Exception e) } 

Здесь упоминается, что это обычно проблема с файлами в Windows.

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

Используйте Apache Commons IO .

Например, давайте посмотрим на мой код (используемый для чтения текстового файла с латинскими и кириллическими символами) ниже:

 String defaultEncoding = "UTF-16"; InputStream inputStream = new FileInputStream(new File("/temp/1.txt")); BOMInputStream bomInputStream = new BOMInputStream(inputStream); ByteOrderMark bom = bomInputStream.getBOM(); String charsetName = bom == null ? defaultEncoding : bom.getCharsetName(); InputStreamReader reader = new InputStreamReader(new BufferedInputStream(bomInputStream), charsetName); int data = reader.read(); while (data != -1) { char theChar = (char) data; data = reader.read(); ari.add(Character.toString(theChar)); } reader.close(); 

В результате у нас есть ArrayList с именем «ari» со всеми символами из файла «1.txt», за исключением спецификации.

Рассмотрим UnicodeReader от Google, который делает все это для вас.

 Charset utf8 = Charset.forName("UTF-8"); // default if no BOM present try (Reader r = new UnicodeReader(new FileInputStream(file), utf8)) { .... } 

Зависимость Maven:

  com.google.gdata core 1.47.1  

Самый простой способ, который я обнаружил, чтобы обойти спецификацию

 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); while ((currentLine = br.readLine()) != null) { //case of, remove the BOM of UTF-8 BOM currentLine = currentLine.replace("",""); 
  • Почему значения cookie с пробелом поступают на стороне клиента с кавычками?
  • Java отправляет и получает файл (byte ) через сокеты
  • Преобразование dta-файла в csv без программного обеспечения Stata
  • Java - поиск файлов в каталоге
  • Как получить файлы в относительном пути в C #
  • Android-файл для сохранения на внешнем хранилище
  • Как получить список файлов в каталоге с помощью C или C ++?
  • Как программно перемещать, копировать и удалять файлы и каталоги на SD?
  • перетащить файлы в стандартный файл html-файла
  • копирование содержимого двоичного файла
  • Как закодировать счетчик для ожидающих процессов в пакетном файле?
  • Давайте будем гением компьютера.