解码的过程。
第一步,在中文win2k中用编辑软件如记事本编写一个Java
源程序文件,程序文件在保存时默认采用了操作系统默认支持
GBK编码格式(操作系统默认支持的格式为file.encoding格式)
形成了一个.java文件,即java程序在被编译前,Java源程序文件
是采用操作系统默认支持的file.encoding编码格式保存的,java
源程序中含有中文信息字符和英文程序代码。
第二步,用JDK的javac.exe文件编译Java源程序。由于JDK
是国际版的,在编译的时候,如果没有用-encoding参数指定Ja-
va源程序的编码格式,则javac.exe首先获得操作系统默认采用
的编码格式。即在编译java程序时,若不指定源程序文件的编
码格式,JDK首先获得操作系统的file.encoding参数(它保存的
就是操作系统默认的编码格式,如WIN2k,它的值为GBK),然
后JDK就把java源程序从file.encoding编码格式转化为Java内部
默认的UNICODE格式放入内存中。然后,javac把转换后的uni-
code格式的文件进行编译成.class类文件,此时.class文件是U-
NICODE编码的,它暂放在内存中。紧接着,JDK将此以UNI-CODE编码的编译后的class文件保存到操作系统中形成.class
文件。对程序员来说,最终获得的.class文件是内容以UNICODE
编码格式保存的类文件。它内部包含源程序中的中文字符串,
且己经由file.encoding格式转化为UNICODE格式了。
在这一步中,对于JSP源程序文件是不同的。对于JSP,过程
是这样的:即WEB容器调用JSP编译器,JSP编译器先查看JSP文
件中是否设置有文件编码格式。如果JSP文件中没有设置JSP文
件的编码格式,则JSP编译器调用JDK先把JSP文件用JVM默认
的字符编码格式(也即WEB容器所在的操作系统的默认的file.
encoding)转化为临时的Servlet类,然后再编译成UNICODE格式
的class类,并保存在临时文件夹中。
第三步,运行第二步编译出来的类,分为以下三种情况:
(1)单机程序,运行该类首先需要JVM支持,即操作系统中
必须安装有JRE。运行过程如下:首先java启动JVM,此时JVM读
出操作系统中保存的class文件并把内容读入内存中,此时内存
中为UNICODE格式的class类,然后JVM运行它。如果此类需要
接收用户输入,则类会默认用file.encoding编码格式对用户输入
的串进行编码并转化为unicode保存入内存(用户可以设置输
入流的编码格式)。程序运行后,产生的字符串(UNICODE编码
的)再回交给JVM,最后JRE把此字符串再转化为file.encoding格
式(用户可以设置输出流的编码格式)传递给操作系统显示接
口并输出到界面上。以上每一步的转化都需要正确的编码格式
转化,才能最终不出现乱码现象。
(2)在Web服务器中运行,客户端请求它时,WEB容器调用
JVM来运行Servlet。首先,JVM把Servlet的class类从系统中读出
并装入内存中,内存中是以UNICODE编码的Servlet类的代码,
然后JVM在内存中运行该Servlet类,如果Servlet在运行的过程
中需要接受从客户端传来的字符,如表单输入的值和URL中传
入的值,此时如果程序中没有设定接收参数时采用的编码格
式,则WEB容器会默认采用ISO-8859-1编码格式来接受传入
的值,在JVM中转化为UNICODE格式并保存在WEB容器的内存
中。Servlet运行后生成输出,输出的字符串是UNICODE格式的,
WEB容器将Servlet运行产生的UNICODE格式的串(如html语