嘿嘿, 我正在使用 BufferedWriter 包裹着 OutputStreamWriter,希望它能输出一个 UTF-8 编码的文件,但在检查文件时它是“ANSI”。
我做错了什么吗?
var txtFile = userTempFolder + Date.now() + ".CreateBuildingMeasures";
var writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(txtFile), "UTF-8"));
writer.write(stringifiedKeywordingObject);
writer.flush();
writer.close();
最佳答案
Notepad++ 只是猜测编码,因为没有办法神奇地告诉它到底是什么。由于您没有显示 stringifiedKeywordingObject
是什么,我猜测它是一个 ASCII 字符串。 ASCII 字符串在任何 ANSI 编码和 UTF-8 中都是相同的,因此 Notepad++ 无法区分。
不过,有一种神奇的方法可以检测 UTF-8。它称为字节顺序标记 (BOM)。但由于字节顺序对于 UTF-8 没有任何意义,因此 Unicode 标准既不要求也不建议对 UTF-8 使用 BOM。有些软件仍然喜欢默认添加它,尤其是微软,这会导致两件事:支持 Unicode 自动检测 UTF-8 的软件(好事)和不支持 Unicode 破坏的软件严重(坏事)。
OutputStreamWriter
没有添加BOM的习惯,所以Notepad++无法检测你的编码。尝试编写一些字符,例如 é
、あ
、א
或 б
并查看它是否会发生变化。然后,Notepad++ 可能会尝试通过查看内容来猜测编码。但由于它是启发式的,因此可能会失败(例如,对于大文件,如果开头是纯英语,则可能看起来不够远,或者可能会错误地将某些内容检测为 UTF-8,因为字符代码相似)。
这整个编码的事情是一个真正的历史困惑,所以它不应该有任何意义。事情就是这样。
关于java - 使用OutputStreamWriter和 "UTF-8"参数的Js/Java写入文件会产生ANSI编码文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36910513/