0

我对编码有一种奇怪的问题。我正在编写一个读取和写入文件的java程序。读写都设置为uft-8,看起来效果不错。当我在记事本++中打开文件并选择“编码”时,它将被设置为“utf-8”,因为它应该。问题是,如果我选择“转换为 utf-8”选项(在记事本 ++ 中),我的文档将被标记为脏,并且切换到十六进制并在 diff 中查看两者会显示出差异。真正的问题是无法正确解析第二个版本。以双斜杠开头的行(应该是注释并被解析器忽略)被解释为“?//”。有谁知道是什么原因造成的以及如何解决?怎么会有不止一种 utf-8?

4

1 回答 1

2

老实说,我不明白为什么 Java UTF-8 解码器不会透明地忽略任何初始 BOM,但不幸的是它没有。

该行为在大约十年前被报告为错误,但 Sun 决定不修复它,因为修复可能会破坏现有的解决方法:错误 4508058

一种可能的解决方法是使用 PushbackReade,查看第一个字符,如果它是 BOM,则将其丢弃:

FileInputStream fis = new FileInputStream("...");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
PushbackReader pr = new PushbackReader(isr);
int c = pr.read();
if(c != 0xFEFF) {
    // not a BOM
    pr.unread(c);
}

// use pr as your reader
于 2012-10-09T13:17:28.870 回答