您的位置:jsp学习站首页 >> JSP类 >> JSP高级 >> 剖析JSP和Servlet对中文的处理(1)

剖析JSP和Servlet对中文的处理(1) (1)

[ 来源:互网络 | 更新日期:2007-09-24 20:45:29 | 浏览次数:9440]
简介:chinaitlab
Java程序员都曾遇到过这样的问题:输入的中文不能正确显示在界面上,保存在数据库中的也是一堆乱码,或者数据库或数据文件中存放的是正确的中文,可是在Java程序中看到的却是一大串的“?”。
  这就是通常所说的“中文问题”。
  Java中与中文相关的编码
  在JDK中,提供了对大多数常用语言的支持。在解决“中文问题”时,表1中的编码是最常用,或者就是最有关系的。
  表1 JDK中与中文相关的编码列表
   
  在实际编程时,接触得比较多的是GB2312(GBK)和ISO8859-1。
  注:UTF是Unicode Transformation Format的缩写,意为Unicode转换格式。可以这么描述JAVA程序中Unicode与UTF的关系,虽然不绝对。字符串在内存中运行时,表现为Unicode代码,而当要保存到文件或其它介质中去时,用的是UTF。这个转化过程是由writeUTF和readUTF来完成得。
  Servlet/JSP对中文的处理过程
  总体流程
  把问题想成是一个黑匣子。先看黑匣子的一级表示(如图1所示):
   
  图1 IPO模型
  这就是一个IPO模型,即输入、处理和输出。同样的内容要经过“从charsetA到Unicode再到charsetB”的转化。
  再看二级表示(如图2所示):
   
  图2 JSP、Java输出模型
  在这个图中,输入的是JSP和Java源文件。在处理过程中,以Class文件为载体,然后输出。再细化到三级(如图3所示):
   
  图3 IPO模型
  JSP文件先生成中间的Java文件,再生成Class。而Servlet和普通App则直接编译生成Class,然后,从Class再输出到浏览器、控制台或数据库等。
  JSP:从源文件到Class的过程
  
  JSP源文件是以“.jsp”结尾的文本文件。在本节中,将阐述JSP文件的解释和编译过程,并跟踪其中中文内容的变化。
  
  一般地,JSP源文件经过如下步骤后变成可被引擎执行的Class文件:
  
  1. JSP/Servlet引擎提供的JSP转换工具(JSPC)搜索JSP文件中用<%@ page contentType ="text/html; charset="%>中指定的charset。如果在JSP文件中未指定,则默认为ISO8859-1(或者说是Latin-1)。
  
  2. JSPC用相当于“Javac -encoding ”解释JSP文件中出现的所有字符,包括中文字符和ASCII字符。然后把这些字符转换成Unicode字符,再转化成UTF格式,存为Java文件。ASCII码字符转化为Unicode字符时只是简单地在前面加“00”,如“A”,转化为“\u0041”。然后,经过了UTF的转换,又变回“41”了。这也就是可以使用普通文本编辑器查看由JSP生成的Java文件的原因。
  
  3. 引擎用相当于“Javac -encoding UTF-8”的命令,把Java文件编译成Class文件。
  
  先看一下这些过程中中文字符的转换情况。有如下源代码:
  
  <%@ page contentType="text/html; charset=gb2312"%>
  
  <%
  String a="中文";
  out.println(a);
  %>
  
  这段代码是在UltraEdit for Windows上编写的。保存后,“中文”两个字的16进制编码为“D6 D0 CE C4”(GB2312编码)。经查表,“中文”两字的Unicode编码为“\u4E2D\u6587”,用 UTF表示就是“E4 B8 AD E6 96 87”。打开引擎生成的由JSP文件转变成的Java文件,发现其中的“中文”两个字的位置确实被“E4 B8 AD E6 96 87”替代了,再查看由Java
[1] [2] [3]
Tags:关键字:剖析JSP和Servlet对中文的处理(1)
责任编辑:glen