首先,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系统没有中文显示支持,所以你看到了乱码(不是问号,问号代表遇到了不认识的字符),而从远程登录时,这些码被正确地显示了出来,这是因为你的远程系统具有中文显示支持。
Java编译和运行过程中的编码问题
最新推荐文章于 2021-03-16 03:45:54 发布