Java编译和运行过程中的编码问题
2006-02-28 10:14
561 查看
首先,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源代码文件中的常量字符串引号内出现的中文字符的运行时显示”的问题
。
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编译和运行过程中的编码问题
- 编写,编译,运行Java程序过程中的编码解码过程
- JDK编译和运行过程全解(dos下的java编译和运行常见问题之解决)
- Sublime Text3中编译运行JAVA控制台中文GBK编码无法输出的问题
- Java在编译运行时出现No enclosing instance of type XXX is accessible问题
- 关于命令行中javac 编译成功,用 java 运行 class 文件出现 “ 找不到或无法加载主类 ” 的问题
- Java应用打包后运行需要注意编码问题
- java中文乱码问题----java不同场景编码转换过程
- Intellij Idea编译项目下的.java文件时的编码问题
- 项目下.java文件采用不同编码方案编译时的编码问题
- 命令行使用javac及java编译、运行java程序出现的问题(Windows XP)
- 编译工程时报java:[1,0] illegal character: \65279问题排查与解决过程
- Java应用打包后运行需要注意编码问题
- Java程序编译和运行的过程【转】
- IEDA Java项目,编译运行,提示“Error:java: 无效的源版本: 1.8”问题
- Java 控制台运行 Jar 传参的编码问题
- 用命令行编译运行java文件的乱码问题
- java8 lambda学习笔记之编译与运行过程
- java程序的编译和运行依赖jdk版本问题
- 关于java编译通过,运行时出错或找不到主类问题解决