有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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代码做得对吗?如果是,记事本++尝试检测编码类型是否有问题

记事本++只是猜测吗


共 (2) 个答案

  1. # 1 楼答案

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

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

    enter image description here

    然后你必须愚弄记事本+,你可以使用下面的代码 enter image description here

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

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

    enter image description here

    然而,如果您只是简单地编写文本,它将被notepad++视为“ANSI”

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

    如果您不想更改记事本++首选项,但仍然希望编码为“不带BOM的UTF-8编码”则必须执行类似操作

    enter image description here

    我在我的博客here中以更好的方式解释了同样的事情

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