中文乱码问题原理及解决方案

来源:互联网 发布:网络互动直播系统 编辑:程序博客网 时间:2024/05/16 06:19

中文乱码问题原理及解决方案
1.中文乱码原理
contentType -- 指定的是JSP页最终Browser(客戶端)所見到的网页內容的编码。
就是 Mozilla的 Character encoding, 或者是 IE6的 encoding. 例如 JSPtw Forum 用的contentType就是 Big5.

pageEncoding -- 指定JSP编写时所用的编码
如果你的是 WIN98, 或 ME 的NOTEPAD记事本JSP, 就一定是常用的是Big5 或 gb2312, 如果是用 WIN2k winXP的NOTEPAD時, SAVE时就可以选择不同的编码, 包括 ANSI(BIG5/GB2312)或 UTF-8 或 UNIONCODE(估是 UCS 16).

因为JSP要经过两次的"编码", 第一阶段会用 pageEncoding, 第二阶段会用 utf-8 至utf-8, 第三阶段就是由TOMCAT出來的网页, 用的是contentType.

阶段一是 JSPC的 JSP至JAVA(.java)原码的"翻译", 它会根据pageEncoding 的设定读取JSP. 结果是 由指定的 pageEncoding(utf-8,Big5,gb2312)的JSP 翻译成统一的utf-8 JAVA原码(.java). 如果pageEncoding设定错了, 或沒设定(预设ISO8859-1), 出来的 在这个阶段就已是中文乱码.

阶段二是由 JAVAC的JAVA原码至JAVA BYTECODE的编译. 不论JSP的编写时是用(utf-8,Big5,gb2312),经过阶段一的结果全都是utf-8的ENCODING的JAVA原码.
JAVAC用 utf-8的ENCODING读取AVA原码, 编译成字串是 utf-8 ENCODING的二进制码(.class). 這这是 JAVA VIRTUAL MACNHINE 对常数字串在 二进制码(JAVA BYTECODE)內表单的规范.

阶段三是TOMCAT(或其的application container)载入和执行 階段二得来的JAVA二进制码, 输出的结果( 也就是BROWSER(客戶端)) 見到的. 这时一早隐藏在階段一和二的参数contentType, 就发挥了功效.

由上可知,
1.如果在jsp页面里有中文,则在显示时不出现乱码,就要设置contentType为gbk,big5,gb2312或utf-8。
2.在日文系统下,jsp页面里有中文,则不仅要设置contentType,还得设置pageEncoding为gbk,big5,gb2312,否则可能出现乱码。

2.中文请求乱码原理
默认情况下,浏览器使用utf-8发送请求,服务器(tomcat/webshere/weblogical等)接收请求后默认使用的是iso8859-1。这时如果在java程序里处理中文就可能出现乱码。
解决方案:request.setCharacterEncoding("gb2312");转换字符集后处理。
3.struts中的中文问题
Struts中,浏览器发送请求后, 在action里取值时,无论怎么转码都是乱码,不管用form.get,还是request.get方法。
这是由于,form中的字段已经由struts将请求中的数据组装到form里了,此时已经为乱码,使用的字符集为服务器默认的字符集,所以在action里取值时,无论怎么转码都是乱码,不管用form.get,还是request.get方法
解决方案:做一个过滤器,在请求到来时,让过滤器过滤请求编码字符集。
public void doFilter(ServletRequest srequest, ServletResponse sresponse,
FilterChain chain) throws IOException, ServletException
{
srequest.setCharacterEncoding(“gb2312”);
chain.doFilter(srequest,sresponse);
}