JSP乱码问题

来源:互联网 发布:grpc java 使用 编辑:程序博客网 时间:2024/06/06 17:30

tomcat5中jsp有乱码问题,而tomcat6没有。

------------------------------------------------------------------------------------------------------------------------------------

在tomcat5下进行如下实验:
1.  jsp页面中只有
<%
 out.write("中国");
%>
那么它的执行过程是:
通过本地平台(windows)gb2312将"中国"转成对应的字节(也就是解码)"98 99"------>JSP引擎使用iso8859-1解码"98 99"成"???"乱码------>通过sevelet的response使用iso8859-1将乱码"???"编码回去成"98 99"
------->IE打开的时候,使用原先设置的utf-8进行解码,出现乱码---------->IE设置编码格式为gb2312,也就是使用gb2312解码98 99为"中国",显示正常。


2.  jsp页面中只有:
<%
 response.setContentType("text/html;charset=gb2312");//告诉浏览器用什么码表进行解码
 out.write("中国");
%>
那么它的执行过程是:
通过本地平台(windows)gb2312将"中国"转成对应的字节(也就是解码)98 99------>JSP引擎使用iso8859-1解码"98 99"成"???"乱码------>通过sevelet的response使用gb2312将乱码"???"编码成更乱的"xx**??"乱码
------->IE打开的时候不管用什么解码,都是乱码,就算用gb2312解回去,还是乱码"???"。
乱码的根源就是JSP引擎用错了码表。


3.  jsp页面中只有:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312" %><!--pageEncoding指定jsp引擎使用什么码表-->
<%
 response.setContentType("text/html;charset=gb2312");//告诉浏览器用什么码表进行解码
 out.write("中国");
%>
那么它的执行过程是:
通过本地平台(windows)gb2312将"中国"转成对应的字节(也就是解码)"98 99"------>JSP引擎使用gb2312解码98 99成"中国"------>通过sevelet的response使用gb2312将"中国"编码成"98 99"
------->IE打开的时候使用gb2312将"98 99"解码成"中国",显示正常。

4. 另外一种显示正常的做法是在page标签加入charset=gb2312,它的作用等同于response.setContentType("text/html;charset=gb2312"):
<%@ page language="java" import="java.util.*" pageEncoding="gb2312" contentType="text/html; charset=gb2312"%><!--charset告诉浏览器用什么码表进行解码-->
<%
 out.write("中国");
%>


------------------------------------------------------------------------------------------------------------------------------------


tomcat6在翻译JSP时,会判断JSP长得像什么码表,就用哪个码表翻译。所以tomcat6没有任何问题。这么说tomcat6是修改了jspservlet?根据jsp引擎确定response使用对应的码表进行编码?
在tomcat6下进行如下实验:
jsp页面中只有以下代码时也没有乱码问题:
<%
 out.write("中国");
%>


------------------------------------------------------------------------------------------------------------------------------------


每个码表在保存数据的时候,前面都有特征码,一看就知道使用了什么码表。


gb2312保存一个汉字的大小为2个字节;
unicode保存任何数据都是2个字节,但是它会在前面加2个字节的特征码(这2个字节的特征码说明我是用unicode码表保存的),所以一个汉字保存时是2+2=4个字节,两个是2+2*2=6个字节;
utf-8保存汉字的时候为3个字节,但是它会在前面加3个字节的特征码(这3个字节的特征码说明我是用utf-8码表保存的),所以一个汉字保存时是3+3=6个字节,两个是3+2*3=9个字节;

可以在UE中使用16进制进行查看特征码,写一个汉字,使用三种不同格式保存,在UE中打开---ctrl+h查看对应的16进制,可以看到前面的特征码。


使用eclipse开发的时候,新建一个JSP文件,其中使用什么码表保存的,就会通知JSP引擎使用什么码表进行解码。
<%@ page language="java" import="java.util.*" pageEncoding="UTF=8" %><!--pageEncoding指定jsp引擎使用什么码表-->
如果pageEncoding改了,对应的文件也改成相应的码表保存。“选中文件—右键—properties—text file encoding”可以看到文件是使用什么码表保存的。
相反,在text file encoding中更改码表,jsp中的pageEncoding也跟着变。

 

 注:参考方立勋老师的视频进行的笔记

 

0 0