java - 使用OutputStreamWriter和 "UTF-8"参数的Js/Java写入文件会产生ANSI编码文件

标签 java encoding utf-8

嘿嘿, 我正在使用 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();

这个想法来自:https://stackoverflow.com/a/6998929/4992212

np++ showing encoding

enter image description here

最佳答案

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/

相关文章:

java - Java Swing 中的 IllegalComponentStateException

java - 使用 URLFetch 发送 channel 消息的服务时出现 SocketTimeoutException

java - 如何在 Java 中为文件名(不是内容)指定一个字符集?

c++ - 从 long 编码/解码整数

mysql - INSERT 后 Perl 和 MySQL UTF-8 格式错误的字符

eclipse - 如何更改eclipse中文件的文本编码?

java - 如何使用 Android 应用程序访问 MySQL 数据库?

python - 在 Python 中使用编码方法。任何类似于 map() 的解决方法?

javascript - UTF-8 字符在 csv 中无法正确显示

java - spring websocket @messagemapping反序列化问题java.lang.ClassCastException : java. util.LinkedHashMap cannot be cast