9

这段代码,

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++ 没有显示任何关于 encoding 的信息。我希望 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++ 尝试检测编码类型是否有问题?

记事本++只是猜测吗?

4

2 回答 2

17

使用不带 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++ 是否正确猜测编码(因为这正是它所做的:它做出有根据的猜测,没有元数据告诉它使用哪种编码)。

于 2013-11-04T13:34:52.290 回答
0

我不知道我的答案是否正确,但让我把我的理解放在这里,

如上所述,如果您写“A”,则 notepad++ 无法理解它是哪种编码类型,但如果您希望 notepad++ 显示“Encode in UTF-8 without BOM”,如下图所示

在此处输入图像描述

然后你必须欺骗 Notepad++,你可以使用下面的代码来做到这一点 在此处输入图像描述

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

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

在此处输入图像描述

但是,如果您只是编写文本,notepad++ 会将其视为“ANSI”。

希望我的解释很清楚,我的分析会对某人有所帮助。然而,这种方法是一种变通方法,不建议使用,但在无助的情况下这是可行的。

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

在此处输入图像描述

我在这里的博客中可能以更好的方式解释了同样的事情

于 2014-04-08T04:17:33.523 回答