为什么在我的UTF-8文本文件中,RandomAccessFile读为“ firt”字符?

时间:2018-08-30 13:53:00

标签: java utf-8 randomaccessfile

有关使用Java读取文本文件的问题。我有一个用UTF-8编码保存的文本文件,仅包含内容:

你好世界。

现在,我正在使用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 :(得分:3)

文件中的前3个字节(0xef0xbb0xbf)被称为 UTF-8 BOM (字节顺序标记)。 BOM仅对UTF-16和UTF-32很重要-对于UTF-8没有意义。 Microsoft对其进行了介绍,以更好地猜测文件编码。

也就是说,并非所有UTF-8编码的文本文件都具有该标记,但是有些文件具有该标记。