我已经知道了System.out是一个PrintStream对象,而PrintStream在创建时使用默认的系统编码。
我写了一个最简单的程序:
public class Demo03
{ public static void main(String[] args) throws Exception{
System.out.println("中国"); }
}
使用:java -Dfile.encoding=UTF-8 Demo03 运行,会出现乱码,我想问下:      file.encoding在System.out.println()中到底起着什么作用?望大牛指点!

解决方案 »

  1.   

    不能说file.encoding在System.out.println()中起什么作用,而是说它在java命令中起什么作用。
    首先,你使用的是java命令,那么,file.encoding命令的作用就是告诉虚拟机,要执行的class文件是以UTF-8编码的,这样虚拟机就会自然按照同样的方式解码。而如果你告诉错了,也就是说你编译源文件的时候并不是用UTF-8编码的,虚拟机按照错误的方式解码,当然会乱码。记住一下两点:
    1,编码和解码是一对操作,用什么字符集编码,就用什么字符集解码,否则就可能乱码。
    2,我猜测你在java命令中用file.encoding可能是想指定一个编码方式,其实错了,java命令中只能解码不能编码了,因为编译的时候(javac)就已经编码了,编码只能针对文本文件操作,而java源文件就是文本文件,而编译之后生成的class文件,已经编了码,所以你只能对它进行解码。所以,根源在于,你需要知道编译的时候用了什么编码,那么你在java命令是使用相同的解码方式就没问题了。当然如果你编译是用的是系统默认的编码方式,java命令也就不需要指定了。
      

  2.   


    “file.encoding命令的作用就是告诉虚拟机,要执行的class文件是以UTF-8编码的” 你这个解释貌似不是很正确吧?
      

  3.   


    “file.encoding命令的作用就是告诉虚拟机,要执行的class文件是以UTF-8编码的” 你这个解释貌似不是很正确吧?为什么?你觉得该怎么解释?你自己检验一下就知道了。
      

  4.   

    class文件是有规范的,不受file.encoding影响。
    file.encoding 影响的是Java I/O的默认编码
      

  5.   

    赞同楼上的说法
    赞同楼上的说法class文件本身只是字节流,是二进制的,何来编码之说。再者,或许他想说的是class文件中的字符串的编码,但是也不合理,相同内容的字符串编码不同就是不同字符串了,根本就没有区分的意义。所以,我也认为应该是指I/O的编码
      

  6.   

    赞同楼上的说法
    赞同楼上的说法class文件本身只是字节流,是二进制的,何来编码之说。再者,或许他想说的是class文件中的字符串的编码,但是也不合理,相同内容的字符串编码不同就是不同字符串了,根本就没有区分的意义。所以,我也认为应该是指I/O的编码源文件中的“中国”两个字是不是被编译到class文件里面了?那么如果不知道class文件的编码,能正确打印出“中国”两个字吗?可以想一想“中国”两个字是从哪里来的?还不是从class文件来的吗?
    再者,file.encoding中的“file”,该怎么解释?
    二进制文件怎么不能有编码,java变量名和方法名也是可以定义成汉字的,那样的话,生成的class文件你能想象没有编码吗?我的意思是说通过一定的编码生成的。
      

  7.   

    没人说class文件要受file.encoding的影响,事实上,使用java命令时,class文件已经生成了,当然不会受任何影响。
      

  8.   

    赞同楼上的说法
    赞同楼上的说法class文件本身只是字节流,是二进制的,何来编码之说。再者,或许他想说的是class文件中的字符串的编码,但是也不合理,相同内容的字符串编码不同就是不同字符串了,根本就没有区分的意义。所以,我也认为应该是指I/O的编码源文件中的“中国”两个字是不是被编译到class文件里面了?那么如果不知道class文件的编码,能正确打印出“中国”两个字吗?可以想一想“中国”两个字是从哪里来的?还不是从class文件来的吗?
    再者,file.encoding中的“file”,该怎么解释?
    二进制文件怎么不能有编码,java变量名和方法名也是可以定义成汉字的,那样的话,生成的class文件你能想象没有编码吗?我的意思是说通过一定的编码生成的。请问 java文件编译成class文件时, 如何选择不同的编码.
      

  9.   


    正解,Java的class文件默认采用utf8的编码方式,Java的字符串是unicode编码的。这个在编译时是不可改变的。
    输出编码改变字符串当然会出乱码啊。