日期:2014-05-18  浏览次数:20622 次

关于字符编码与解码的几个问题,希望大家一起讨论!
提几个问题:

1.从JSP页面按get或post方式传递参数,到返回结果这个过程中,中文参数会被经过几次字符编码,具体经过哪些编码过程?

2.JSP页面设置的字符编码会对传递的参数进行编码吗?如JSP页面设置为:
HTML code

    <%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>


  那么在传递参数之前,会将参数先进行编码成GBK吗?

3.在参数传递到服务器这个过程中(tomcat),会进行几次URLEncoder.encode()编码和几次URLDecoder.decode()解码,并且 编码和解码的时候都采用什么字符编码格式?在传递的过程中是否也会使用new String(s.getBytes("GBK"), "UTF-8")这种方式进行转码或者其他方式进行转码?

4.如果在tomcat的server.xml文件的<Connector>中设置URIEncoding属性,是否会将所有请求进行一次编码,这样的话又是在什么地方进行解码的呢?URLEncoding这个属性设置与不设置的区别如何?

5.如下面代码中,如何再将乱码转换回汉字?
Java code

        String s = "中文";       
        try {
            s = new String(s.getBytes("GBK"), "UTF-8");
        } catch (UnsupportedEncodingException e3) {
            e3.printStackTrace();
        }
        System.out.println(s);


  此时,s已经被转换为乱码,如何再将它转换回正常的汉字呢?

以上几个问题,我已经迷惑了好久,始终没有一个清晰的概念,希望大家一起讨论!希望了解的高人们能够给出一个清晰的回答,在参数传递这整个流程中,都经过了哪些关键的编码或转码?
如果有好的资料,也希望不吝分享!

------解决方案--------------------
这是我以前在别的帖子上发的希望对大家有帮助

关于中文乱码问题的几点总结:
1、unicode,utf-8,gbk,gb2312等都是字符编码,是指怎么用字节来表示字符。
2、java使用的是unicode,此话的意思是指运行时java的char类型是一个unicode编码字符,占两个字节。
3、java原文件一般都是以本地字符编码存储在本地文件系统中的。
4、java类文件是以unicode编码存储在本地文件系统中的。
5、当从一个字节序列转化为一个字符串的时候,需要字符编码。

乱码问题一般就是发生在第5步,比如一个4字节iso8859-1编码的字节(如:a,b,c,d),如果使用正确的字符编码转化它将被转化为4个字符(a,b,c,d)占8个字节,如果使用gbk编码转化它将被转为2个字符,同时着两个字符肯定也不是合法的gbk字符(??),乱码也就产生了。

jsp中的乱码问题
1、首先说读取数据,web服务器接收请求时,接受到的是字节序列,转化为字符时就需要知道此字符序列的编码,才能正确转化。对于tomcat来讲,如果未指定则默认使用iso8859-1,而通常中文平台的编码是gb2312,所以就会产生乱玛。
2、 <%@ page contentType="text/html; charset=GBK" %>
着句的意思是设置http响应头,提示浏览器使用的字符编码,同时设置http响应(response)的字符编码。
3、对于tomcat的get请求,编码的处理是在server.xml的connctor的URIEncoding中指定的。

这是对乱码的总结。 


支持楼主上面的这样的讨论帖子
------解决方案--------------------

------解决方案--------------------
有人说,乱码问题一直跟中国的程序员特别有缘,真是再同意不过了,不管是Struts,JSF,JSP,还是MySQL,Tomcat,全都或多或少有乱码的问题。
一般的做法有用Filter:
< filter > 
< filter-name > Set Character Encoding </ filter-name > 
< filter-class > org.springframework.web.filter.CharacterEncodingFilter </ filter-class > 
< init-param > 
< param-name > encoding </ param-name > 
< param-value > GBK </ param-value > 
</ init-param > 
< init-param > 
< param-name > ignore </ param-name > 
< param-value > true </ param-value > 
</ init-param > 
</ filter > 
< filter-mapping > 
< filter-name > Set Character Encoding </ filter-name > 
< url-pattern > *.do </ url-pattern > 
</ filter-mapping > 
< filter-mapping > 
< filter-name > Set Character Encoding </ filter-name > 
< url-pattern > *.jsp </ url-pattern > 
</ filter-mapping > 
< filter-mapping > 
< filter-name > Set Character Encoding </ filter-name > 
< url-pattern > *.ht