当前位置:编程学习 > JAVA >>

关于System.out的问题

我已经知道了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()中到底起着什么作用?

望大牛指点! --------------------编程问答-------------------- 不能说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命令也就不需要指定了。 --------------------编程问答--------------------
引用 1 楼 valenon 的回复:
不能说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命令也就不需要指定了。


“file.encoding命令的作用就是告诉虚拟机,要执行的class文件是以UTF-8编码的” 你这个解释貌似不是很正确吧? --------------------编程问答-------------------- 是不是在把数据输出的时候,使用你自己的编码进行解码,导致输出乱码。 --------------------编程问答--------------------
引用 2 楼 xiazdong 的回复:
Quote: 引用 1 楼 valenon 的回复:

不能说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命令也就不需要指定了。


“file.encoding命令的作用就是告诉虚拟机,要执行的class文件是以UTF-8编码的” 你这个解释貌似不是很正确吧?
为什么?你觉得该怎么解释?你自己检验一下就知道了。 --------------------编程问答-------------------- class文件是有规范的,不受file.encoding影响。
file.encoding 影响的是Java I/O的默认编码 --------------------编程问答--------------------
引用 5 楼 huntor 的回复:
class文件是有规范的,不受file.encoding影响。
file.encoding 影响的是Java I/O的默认编码

赞同楼上的说法 --------------------编程问答-------------------- 这个我也不太清楚啊 --------------------编程问答--------------------
引用 6 楼 wangyunbo158 的回复:
Quote: 引用 5 楼 huntor 的回复:

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

赞同楼上的说法

赞同楼上的说法

class文件本身只是字节流,是二进制的,何来编码之说。再者,或许他想说的是class文件中的字符串的编码,但是也不合理,相同内容的字符串编码不同就是不同字符串了,根本就没有区分的意义。所以,我也认为应该是指I/O的编码 --------------------编程问答--------------------
引用 8 楼 owen1759 的回复:
Quote: 引用 6 楼 wangyunbo158 的回复:

Quote: 引用 5 楼 huntor 的回复:

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

赞同楼上的说法

赞同楼上的说法

class文件本身只是字节流,是二进制的,何来编码之说。再者,或许他想说的是class文件中的字符串的编码,但是也不合理,相同内容的字符串编码不同就是不同字符串了,根本就没有区分的意义。所以,我也认为应该是指I/O的编码
源文件中的“中国”两个字是不是被编译到class文件里面了?那么如果不知道class文件的编码,能正确打印出“中国”两个字吗?可以想一想“中国”两个字是从哪里来的?还不是从class文件来的吗?
再者,file.encoding中的“file”,该怎么解释?
二进制文件怎么不能有编码,java变量名和方法名也是可以定义成汉字的,那样的话,生成的class文件你能想象没有编码吗?我的意思是说通过一定的编码生成的。 --------------------编程问答--------------------
引用 5 楼 huntor 的回复:
class文件是有规范的,不受file.encoding影响。
file.encoding 影响的是Java I/O的默认编码
没人说class文件要受file.encoding的影响,事实上,使用java命令时,class文件已经生成了,当然不会受任何影响。 --------------------编程问答--------------------
引用 9 楼 valenon 的回复:
Quote: 引用 8 楼 owen1759 的回复:

Quote: 引用 6 楼 wangyunbo158 的回复:

Quote: 引用 5 楼 huntor 的回复:

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

赞同楼上的说法

赞同楼上的说法

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

class文件是有规范的,不受file.encoding影响。
file.encoding 影响的是Java I/O的默认编码
没人说class文件要受file.encoding的影响,事实上,使用java命令时,class文件已经生成了,当然不会受任何影响。


正解,Java的class文件默认采用utf8的编码方式,Java的字符串是unicode编码的。这个在编译时是不可改变的。
输出编码改变字符串当然会出乱码啊。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,