Почему RandomAccessFile читает «» »как первый символ в моем текстовом файле UTF-8? - PullRequest
0 голосов
/ 30 августа 2018

Вопрос по чтению текстовых файлов на Java. У меня есть текстовый файл, сохраненный в кодировке UTF-8 только с содержимым:

Hello. Мир.

Теперь я использую RandomAccessFile, чтобы прочитать этот класс. Но по какой-то причине в начале файла, кажется, есть «невидимый» символ ...?

Я использую этот код:

File file = new File("resources/texts/books/testfile2.txt");
try(RandomAccessFile reader = new RandomAccessFile(file, "r")) {

    String readLine = reader.readLine();
    String utf8Line = new String(readLine.getBytes("ISO-8859-1"), "UTF-8" );
    System.out.println("Read Line: " + readLine);
    System.out.println("Real length: " + readLine.length());
    System.out.println("UTF-8 Line: " + utf8Line);
    System.out.println("UTF-8 length: " + utf8Line.length());
    System.out.println("Current position: " + reader.getFilePointer());
} catch (Exception e) {
    e.printStackTrace();
}

Вывод такой:

Read Line: ?»?Hello. World.
Real length: 16
UTF-8 Line: ?Hello. World.
UTF-8 length: 14
Current position: 16

Эти (1 или 2) символы появляются только в самом начале. Если я добавлю больше строк в файл и прочту их, то все дальнейшие строки читаются нормально. Может кто-нибудь объяснить это поведение? Что это за персонаж в начале?

Спасибо!

1 Ответ

0 голосов
/ 30 августа 2018

Первые 3 байта в вашем файле (0xef, 0xbb, 0xbf) называются UTF-8 BOM (метка порядка байтов). Спецификация важна только для UTF-16 и UTF-32 - для UTF-8 она не имеет значения. Microsoft представила его для лучшего понимания кодировки файла.

То есть не все текстовые файлы в кодировке UTF-8 имеют такую ​​метку, но некоторые имеют.

...