【问题标题】:Write UTF-8 file in Java [duplicate]用Java编写UTF-8文件[重复]
【发布时间】:2015-01-15 08:00:34
【问题描述】:

当我在 Java 中创建一个使用 UTF-8 编码的文件,然后我在记事本或 Notepad++ 中打开它时,它说它是 ANSI 编码的。怎么来的?

File file = new File("path\to\file");
file.createNewFile();
Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8));

writer.write("something");
writer.flush();
writer.close();

如果我写一些特殊字符,比如 Æ。 Ø或Å到文件,然后记事本说它是UTF-8编码的。这是为什么呢?

如果不包含特殊字符,ANSI 和 UTF-8 字节表示是否相同?

【问题讨论】:

  • 由于你使用Java 7+,你应该使用java.nio.file而不是File

标签: java file utf-8


【解决方案1】:

UTF-8 和 ANSI 对前 127 个字符 [1] 具有相似的字节编码。所以如果你不使用任何其他字符,就无法区分。

判断它是 UTF-8 的唯一方法是添加一个 Byte-Order-Mark,它是一组特制的字节,用于标记文件的编码:

BOM 的 UTF-8 表示是字节序列0xEF,0xBB,0xBF

[1] unicode 字符 U+0000..U+007F,在 UTF-8 和 ASCII 中以二进制表示为一个字节,最高位均为 0。

【讨论】:

  • 嗯,不,BOM 不是唯一的方法;一直使用 UTF-8 就可以了
  • @fge 如果只使用低 7 位字符(ascii),ANSI 和 UTF-8 完全相似。
  • BOM 也是一个 Unicode 码位; U+FEFF 准确地说。
  • @sjallamander 完全正确;现在,Notepad{,++} 应该可能会进入 21 世纪并默认采用 UTF-8 ;)
  • 技术上 UTF-8 不使用也不需要 BOM,仅出于兼容性原因允许(但不鼓励)将 BOM 与 UTF-8 一起使用。 UTF16 和 UTF32 需要 BOM 来辨别 LE(小端)和 BE(大端),但 UTF-8 没有字节序问题,因为字节顺序始终相同。
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 2014-11-19
相关资源
最近更新 更多