深入剖析JSP和Servlet对中文的处理

2019-05-27 08:13:05于海丽


序号步骤说明结果
1编写Servlet源文件,且存为GB2312格式D6 D0 CE C4
(D6D0=中 CEC4=文)
2用javac –encoding GB2312把JAVA源文件编译成CLASS文件E4 B8 AD E6 96 87 (UTF)
3运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码4E 2D 65 87 (Unicode)
4根据Servlet-charset=GB2312把Unicode转化为字节流D6 D0 CE C4 (GB2312)
5把字节流输出到IE中并设置IE的编码属性为Servlet-charset=GB2312D6 D0 CE C4 (GB2312)
6IE用“简体中文”查看结果“中文”(正确显示)

  如果<Compile-charset>=ISO8859-1,<Servlet-charset>=ISO8859-1

  表8 Compile-charset=Servlet-charset=ISO8859-1时的变化过程

序号步骤说明结果
1编写Servlet源文件,且存为GB2312格式D6 D0 CE C4
(D6D0=中 CEC4=文)
2用javac –encoding ISO8859-1把JAVA源文件编译成CLASS文件C3 96 C3 90 C3 8E C3 84 (UTF)
3运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码00 D6 00 D0 00 CE 00 C4
4根据Servlet-charset=ISO8859-1把Unicode转化为字节流D6 D0 CE C4
5把字节流输出到IE中并设置IE的编码属性为Servlet-charset=ISO8859-1D6 D0 CE C4 (GB2312)
6IE用“西欧字符”查看结果乱码(原因同表5)
7改变IE的页面编码为“简体中文”“中文”(正确显示)

  如果不指定Compile-charset或Servlet-charset,其默认值均为ISO8859-1。

  当Compile-charset=Servlet-charset时,第2步和第4步能互逆,“抵消”,显示结果均能正确。读者可试着写一下Compile-charset<>Servlet-charset时的情况,肯定是不正确的。

  当输出对象是数据库时

  输出到数据库时,原理与输出到浏览器也是一样的。本节只是Servlet为例,JSP的情况请读者自行推导。

  假设有一个Servlet,它能接收来自客户端(IE,简体中文)的汉字字符串,然后把它写入到内码为ISO8859-1的数据库中,然后再从数据库中取出这个字符串,显示到客户端。

  表9 输出对象是数据库时的变化过程(1)

序号步骤说明结果
1在IE中输入“中文”