java 中的字符编码

character encoding in java

我试过下面的代码:

public static void main(String[] args) throws IOException {
    String s = "NETWORK";
    try (
            FileOutputStream fos = new FileOutputStream("d:/endian.txt");
            OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF_16BE");) {
        osw.write(s);
        osw.flush();

    }
}

在 运行 之后,我得到一个包含以下链的文件:N E T W O R K;结果文件的大小为 14 字节(7 个字符 * 2 字节)。注意链条字符之间的空格。 当我将编码更改为:UTF_16LE 时,我得到一个 14 字节的文件,其中包含以下字符串:NETWORK。字符之间没有空格!我希望得到如下字符串:N E T W O R K。我用记事本打开文件。 谁能解释这种行为?

不要使用记事本打开文件。它在检测编码方面做得很糟糕。使用更好的工具,您可以在其中指定编码,例如NotePad++ 或十六进制编辑器。

"NETWORK" 字符串的二进制表示,使用:

  • UTF_16BE 是:

    00 4E 00 45 00 54 00 57 00 4F 00 52 00 4B(记事本:N E T W O R K

  • UTF_16LE 是:

    4E 00 45 00 54 00 57 00 4F 00 52 00 4B 00(记事本:NETWORK

您描述的行为的原因是因为记事本将 UTF_16BE 字符串的 "NETWORK" 表示识别为 ANSIUTF_16LE "NETWORK" 字符串表示为 UNICODE.

如前所述,最好使用 hex editor 查看生成文件的二进制表示,以便准确查看写入的内容。