java编写无BOM的UTF8
这个代码
OutputStream out = new FileOutputStream(new File("C:/file/test.txt"));
out.write("A".getBytes());
而这个,
OutputStream out = new FileOutputStream(new File("C:/file/test.txt"));
out.write("A".getBytes(StandardCharsets.UTF_8));
产生相同的结果(在我看来),即UTF-8没有BOM。但是,记事本++没有显示任何有关编码的信息。我希望记事本++在这里显示为Encode in UTF-8 without BOM
,但是在“encoding”菜单中没有选择编码
现在,这段代码用UTF-8编写带有BOM编码的文件
OutputStream out = new FileOutputStream(new File("C:/file/test.txt"));
byte[] bom = { (byte) 239, (byte) 187, (byte) 191 };
out.write(bom);
out.write("A".getBytes());
记事本++还将编码类型显示为Encode in UTF-8
问题:前两个代码假设使用UTF-8编写文件,但没有BOM,这两个代码有什么问题?我的Java代码做得对吗?如果是,记事本++尝试检测编码类型是否有问题
记事本++只是猜测吗
# 1 楼答案
我不知道我的答案是否正确,但让我把我的理解放在这里
如上所述,如果您只写“A”,notepad++无法理解它是哪种类型的编码,但如果您希望notepad++显示“编码为UTF-8,无BOM”,如下图所示
然后你必须愚弄记事本+,你可以使用下面的代码
如果希望notepad++显示“在UTF-8中编码”,那么应该从osw中删除子字符串部分。写入(“\uFEFF”),因为这是您试图插入的BOM表字符。当您插入此字符时,文件编码类型将变为“编码为UTF-8”,当您以编程方式删除此字符时,文件编码类型将变为“编码为UTF-8,无BOM”,因为您已删除此BOM字符
另一个设置是更改Notepad++的首选项,如下所示, 通过这样做,记事本++才能识别您想要的编码
然而,如果您只是简单地编写文本,它将被notepad++视为“ANSI”
希望我的解释清楚,我的分析能帮助别人。 然而,这种方法是一种变通方法,不建议使用,但在无助的情况下,这种方法是可行的
如果您不想更改记事本++首选项,但仍然希望编码为“不带BOM的UTF-8编码”则必须执行类似操作
我在我的博客here中以更好的方式解释了同样的事情
# 2 楼答案
使用不带BOM的UTF-8编写的“A”生成的文件与使用ASCII或ISO-8859-*或任何其他ASCII兼容编码编写的“A”完全相同。该文件包含一个十进制值为65的字节
这样想:
"A".getBytes("UTF-8")
返回一个new byte[] { 65 }
"A".getBytes("ISO-8859-1")
返回一个new byte[] { 65 }
该文件中没有任何内容表明需要使用UTF-8对其进行解码
尝试编写“Käsekuchen”或其他不能用ASCII编码的代码,看看Notepad++是否正确猜测了编码(因为这正是它所做的:它进行了有根据的猜测,没有元数据告诉它使用哪种编码)