编写没有BOM的UTF-8

时间:2013-11-04 13:31:38

标签: java unicode utf-8 notepad++ byte-order-mark

此代码,

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 ++试图检测编码类型是否有问题?

记事本++只能猜测吗?

2 个答案:

答案 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编码”,如下图所示

enter image description here

然后你必须使用以下代码来欺骗Notepad ++ enter image description here

如果你想让notepad ++显示“以UTF-8编码”,那么你应该从osw.write(“\ uFEFF”)中删除子串部分,因为这是你试图插入的BOM字符。当您插入此字符时,文件编码类型将变为“编码为UTF-8”,当您以编程方式删除时,它将变为“在没有BOM的情况下以UTF-8编码”,因为您已删除此BOM字符。

您需要做的另一个设置是更改Notepad ++的首选项,如下所示, 通过这样做,Notepad ++只能识别您想要的编码。

enter image description here

但是,如果您只是简单地写文本,它将被记事本++视为“ANSI”。

希望我的解释清楚,我的分析可以帮助别人。 然而,这种方法是一种解决方法,并没有建议,但在一个无助的情况下这是有效的。

如果您不希望更改Notepad ++首选项,并且您仍希望编码为“在没有BOM的UTF-8中编码”,那么您必须执行以下操作,

enter image description here

我在博客here

中可能更好地解释了同样的事情