为什么Linux与Windows中的显示会有所不同?
System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));
Windows中的:
¿
在Linux中:
¿
答案 0 :(得分:15)
System.out.println()以系统默认编码输出文本,但控制台根据自己的编码(或“代码页”)设置解释该输出。在您的Windows机器上,两个编码似乎匹配,但在Linux机器上,输出显然是UTF-8,而控制台将其解码为像ISO-8859-1这样的单字节编码。或者,正如Jon建议的那样,源文件被保存为UTF-8,javac
正在将其作为其他内容读取,这是一个可以通过使用Unicode转义来避免的问题。
当您需要输出除ASCII文本以外的任何内容时,最好的办法是使用适当的编码将其写入文件,然后使用文本编辑器读取文件 - 控制台太有限且太依赖于系统。顺便说一下,这段代码:
new String("¿".getBytes("UTF-8"), "UTF-8")
...对输出没有影响。所有这一切都是将字符串的内容编码为字节数组并再次解码,再现原始字符串 - 一个昂贵的无操作。如果要以特定编码输出文本,则需要使用OutputStreamWriter,如下所示:
FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
答案 1 :(得分:8)
不确定问题的确切位置,但值得注意的是
¿(0xc2,0xbf)
是使用UTF-8进行编码的结果
0xbf,
是¿
的Unicode代码点所以,看起来在linux的情况下,输出没有显示为utf-8,而是显示为单字节字符串
答案 2 :(得分:6)
检查你的linux终端有什么编码。
对于ubuntu中的gnome-terminal - 进入“终端”菜单并选择“设置字符编码”。
对于putty,配置 - >窗口 - >翻译 - > UTF-8(如果不起作用,请参阅this post)。
答案 3 :(得分:2)
运行此代码以帮助确定它是编译器还是控制台问题:
public static void main(String[] args) throws Exception {
String s = "¿";
printHex(Charset.defaultCharset(), s);
Charset utf8 = Charset.forName("UTF-8");
printHex(utf8, s);
}
public static void printHex(Charset encoding, String s)
throws UnsupportedEncodingException {
System.out.print(encoding + "\t" + s + "\t");
byte[] barr = s.getBytes(encoding);
for (int i = 0; i < barr.length; i++) {
int n = barr[i] & 0xFF;
String hex = Integer.toHexString(n);
if (hex.length() == 1) {
System.out.print('0');
}
System.out.print(hex);
}
System.out.println();
}
如果UTF-8的编码字节在每个平台上都不同(它应该是 c2bf ),那么这是编译器问题。
如果是编译器问题,请将“¿”替换为"\u00bf"。
答案 4 :(得分:1)
由于您的编辑器和编译器编码,很难确切知道源代码包含哪些字节,或者调用getBytes()的字符串。
你能制作一个简短但完整的程序,只包含ASCII(以及字符串中相关的\ uxxxx转义)仍能显示问题吗?
我怀疑问题可能出在Windows或Linux上的控制台输出上,但最好先获得可重现的程序。