首先,java的中文问题出现在很多场合内。每种场合使用不同的处理方法。你这里想搞清
楚的是“在java源代码文件中的常量字符串引号内出现的中文字符的运行时显示”的问题
。
ok,那么我们就来看看javac如何编译该字符串。首先,javac看命令行中有没有用-encod
ing参数指定一个字符集,没有,则用系统环境中指定的字符集。接下来javac开始解释源
码文件,遇到多字节的字符,就用前面确定的字符集编码来解释,并转换为unicode,写入
.class 的字节码文件里面。
好了,下面我们要运行这个class文件了,jvm启动后读入class字节码,那些个中文字符串
都以unicode表示,这没什么可说的,在哪都一样(平台无关的)。下面可能需要输出这个字
符串到其它的应用程序了:控制台/文件/socket等等等等....这样jvm首先要检查操作系统
的 encoding(注意,jvm从字节码里面完全不知道这些字符串是什么编码的,全是unicode
),然后按该encoding来解释这些 unicode码到操作系统的encoding。当然,对于特殊的环
境jvm也许不去检查操作系统的encoding,而是从环境变量里面读,这样你就可以控制jvm
执行时的目的encoding了。
最后一步,如果你的操作系统的(或目的)encoding与真实的encoding一致(或具有兼容关系
),那么你将看到正确的字符串,如果你不一致,你会看到什么?对了,是问号。
所以“在 Linux 操作系统上就是ISO-8859-1”是不对的,关键是环境变量LANG是怎么设置
的,以及有没有显式地使用-encoding参数。
其实如果你编译和运行如果在同一个操作系统上运行的话,输出是绝对不会有问题的。那
么你的第四个问题是怎么产生的呢?很简单,虚拟机运行时输出的字符串是100%正确的,
可惜你的linux系统没有中文显示支持,所以你看到了乱码(不是问号,问号代表遇到了不
认识的字符),而从远程登录时,这些码被正确地显示了出来,这是因为你的远程系统具有
中文显示支持。