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" 表示识别为 ANSI
和 UTF_16LE "NETWORK" 字符串表示为 UNICODE
.
如前所述,最好使用 hex editor 查看生成文件的二进制表示,以便准确查看写入的内容。
我试过下面的代码:
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" 表示识别为 ANSI
和 UTF_16LE "NETWORK" 字符串表示为 UNICODE
.
如前所述,最好使用 hex editor 查看生成文件的二进制表示,以便准确查看写入的内容。