我对编码有一些奇怪的问题。我正在编写一个读写文件的java程序。阅读和写作都设置为uft-8,看起来效果很好。 当我在notepad ++中打开文件并选择'encoding'时,它将被设置为'utf-8'。问题是,如果我选择“转换为utf-8”选项(在记事本++中),我的文档将被标记为脏,并切换到十六进制并在diff中查看两者将显示差异。 真正的问题是第二个版本将无法正确解析。以双斜杠开头的行(应该是注释并被解析器忽略)被解释为“?//”。有谁知道是什么导致了这个以及如何解决它?怎么会有不止一种utf-8?
答案 0 :(得分:2)
老实说,我不明白为什么Java UTF-8解码器不会透明地忽略任何初始BOM,但不幸的是它没有。
该行为几乎在十年前被报告为一个错误,但Sun决定不修复它,因为该修复可能会破坏现有的解决方法:Bug 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