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

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


  表5 Jsp-charset = ISO8859-1时的变化过程

序号步骤说明结果
1编写JSP源文件,且存为GB2312格式D6 D0 CE C4
(D6D0=中 CEC4=文)
2jspc把JSP源文件转化为临时JAVA文件,并把字符串按照ISO8859-1映射到Unicode,并用UTF格式写入JAVA文件中C3 96 C3 90 C3 8E C3 84
3把临时JAVA文件编译成CLASS文件C3 96 C3 90 C3 8E C3 84
4运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码00 D6 00 D0 00 CE 00 C4
(啥都不是!!!)
5根据Jsp-charset=ISO8859-1把Unicode转化为字节流D6 D0 CE C4
6把字节流输出到IE中,并设置IE的编码为ISO8859-1(作者按:这个信息隐藏在HTTP头中)D6 D0 CE C4
7IE用“西欧字符”查看结果乱码,其实是四个ASCII字符,但由于大于128,所以显示出来的怪模怪样
8改变IE的页面编码为“简体中文”“中文”(正确显示)

  奇怪了!为什么把<Jsp-charset>设成GB2312和ISO8859-1是一个样的,都能正确显示?因为表4表5中的第2步和第5步互逆,是相互“抵消”的。只不过当指定为ISO8859-1时,要增加第8步操作,殊为不便。

  再看看不指定<Jsp-charset> 时的情况。

  表6 未指定Jsp-charset 时的变化过程

序号步骤说明结果
1编写JSP源文件,且存为GB2312格式D6 D0 CE C4
(D6D0=中 CEC4=文)
2jspc把JSP源文件转化为临时JAVA文件,并把字符串按照ISO8859-1映射到Unicode,并用UTF格式写入JAVA文件中C3 96 C3 90 C3 8E C3 84
3把临时JAVA文件编译成CLASS文件C3 96 C3 90 C3 8E C3 84
4运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码00 D6 00 D0 00 CE 00 C4
5根据Jsp-charset=ISO8859-1把Unicode转化为字节流D6 D0 CE C4
6把字节流输出到IE中D6 D0 CE C4
7IE用发出请求时的页面的编码查看结果视情况而定。如果是简体中文,则能正确显示,否则,需执行表5中的第8步

  Servlet:源文件为JAVA文件,格式是GB2312,源文件中含有“中文”这两个汉字

  如果<Compile-charset>=GB2312,<Servlet-charset>=GB2312

  表7 Compile-charset=Servlet-charset=GB2312 时的变化过程