即使使用UTF-8,为什么在Windows与Linux中显示不同?

Ran*_*yaa 2 java utf-8 character-encoding

为什么以下在Linux与Windows中显示不同?

System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));
Run Code Online (Sandbox Code Playgroud)

在Windows中:

¿

在Linux中:

一个

Ala*_*ore 15

System.out.println()以系统默认编码输出文本,但控制台根据自己的编码(或"代码页")设置解释该输出.在您的Windows机器上,两个编码似乎匹配,但在Linux机器上,输出显然是UTF-8,而控制台将其解码为像ISO-8859-1这样的单字节编码.或者,正如Jon建议的那样,源文件被保存为UTF-8并将javac其作为其他东西读取,这是一个可以通过使用Unicode转义来避免的问题.

当您需要输出除ASCII文本以外的任何内容时,最好的办法是使用适当的编码将其写入文件,然后使用文本编辑器读取文件 - 控制台太有限且与系统有关.顺便说一句,这段代码:

new String("¿".getBytes("UTF-8"), "UTF-8")
Run Code Online (Sandbox Code Playgroud)

......对输出没有影响.所有这一切都是将字符串的内容编码为字节数组并再次解码,再现原始字符串 - 一个昂贵的无操作.如果要以特定编码输出文本,则需要使用OutputStreamWriter,如下所示:

FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
Run Code Online (Sandbox Code Playgroud)


Jua*_*ano 8

不确定问题究竟在哪里,但值得注意的是

¿(0xc2,0xbf)

是使用UTF-8编码的结果

为0xBF,

这是¿的Unicode代码点

因此,在linux的情况下,输出不会显示为utf-8,而是显示为单字节字符串


Ham*_*ner 6

检查你的linux终端有什么编码.

对于ubuntu中的gnome-terminal - 转到"终端"菜单并选择"设置字符编码".

对于putty,配置 - >窗口 - >翻译 - > UTF-8(如果不起作用,请参阅此帖子).