使用OutputStreamWriter和" UTF-8" Js / Java编写文件参数结果为ANSI编码文件

时间:2016-04-28 09:27:18

标签: java encoding utf-8

Heyho, 我使用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

1 个答案:

答案 0 :(得分:1)

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,因为字符代码相似)

这整个编码事物是一个真正的历史混乱,所以它没有任何意义。这就是它的方式。