Java中的字符编码

4
我已经尝试了下面的代码:

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。我使用记事本打开文件。 有人能解释这种行为吗?

1
这两次尝试有什么不同之处吗?我看你两次都使用了UTF_16LE? - C-Otto
如果将“UTF_16LE”替换为“UTF_8”,会发生什么? - hcarrasko
记事本使用哪种编码打开文件?它是否与您使用的编码匹配? - gregdim
我已经拿到你的代码并且它按照预期工作。当我使用UTF_16LE字符集时,它生成大小为14 KB的N E T W O R K文件。当我不使用任何字符集时,如预期的那样,字符串是NETWORK,文件大小为7 KB。你有什么问题吗? - Aninda Bhattacharyya
@C-Otto:请查看更新。 - Kachna
1
使用十六进制编辑器而非文本编辑器来查看文件。 - vanza
2个回答

4

使用以下方式对"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)

你所描述的行为是因为记事本将 "NETWORK" 字符串的 UTF_16BE 格式识别为 ANSI,而将 "NETWORK" 字符串的 UTF_16LE 格式识别为 UNICODE

建议使用十六进制编辑器查看生成文件的二进制表示,以确切地了解写入了什么内容。


1
你可能是指将“NETWORK”字符串的UTF_16LE表示形式作为UNICODE。 - gregdim
谢谢。那就是我想说的。 - PrimosK
实际上,当我使用十六进制编辑器时,我得到了预期的结果。谢谢大家。 - Kachna

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

1
NotePad++ 给出了相同的结果。 - Kachna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接