java中的字符编码

java中的字符编码,java,io,Java,Io,我尝试了以下代码: 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_

我尝试了以下代码:

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 T W O R K;结果文件的大小为14个字节(7个字符*2个字节)。请注意链的字符之间的空格。 当我用:UTF_16LE更改编码时,我得到一个14字节的文件大小,其中包含以下字符串: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(记事本:
    网络

您描述行为的原因是,记事本将“网络”字符串的UTF_16BE表示为
ANSI
,将“网络”字符串的UTF_16LE表示为
UNICODE


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

这两次尝试的区别在哪里?我看到您在这两种情况下都使用UTF_16LE?如果您将“UTF_16LE”替换为“UTF_8”,会发生什么情况?记事本以哪种编码打开文件?它和你使用的匹配吗?我得到了你的代码,它正在按预期工作。当我使用UTF_16LE的字符集时,它正在生成文件大小为14KB的N T W O R K。当我不使用任何东西时,正如预期的那样,字符串是NETWORK,文件大小为7KB。您的问题是什么?请使用十六进制编辑器,而不是文本编辑器来查看文件。您的意思可能是“网络”字符串的UTF_16LE表示为UNICODE”谢谢。。这就是我的意思。事实上,当我使用十六进制编辑器时,我得到了预期的结果。谢谢你,伙计TEPAD++也给出了同样的结果