当操作系统的环境变量中lang为en时,websphere处理中文时需要在console中设置JVM自变量一项为:-Dclient.encoding.override=GB2312,否则中文为乱码,weblogic则需要操作系统得语言环境为中文。
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一致(或具有兼容关系 ),那么你将看到正确的字符串,如果你不一致,你会看到什么?对了,是问号。
所以是否为乱码关键是环境变量LANG是怎么设置 的,以及有没有显式地使用-encoding参数。
其实如果你编译和运行如果在同一个操作系统上运行的话,输出是绝对不会有问题的。但是当跨平台时,虚拟机运行时输出的字符串是100%正确的, 可惜你的linux系统没有中文显示支持,所以你看到了乱码(不是问号,问号代表遇到了不 认识的字符)。
阅读(8271) | 评论(0) | 转发(0) |