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