jsp 编码问题

 jsp编写网站时,经常会出现如下图所示的乱码情况:

 

图片

原因是:

request.setCharacterEncoding("GBK");

String title=request.getParameter("title");

//        new String(new String(title.getBytes("GBK"),"ISO-8859-1").getBytes("ISO-8859-1"),"utf-8" );

而本来应该是

 request.setCharacterEncoding("UTF-8"); 的。 

一个中文字符,GBK占两个字节;UTF-8占三个字节。
以上例来说,本来应该显示“反扫荡”,UTF-8编码的,9个字符。实际上http协议传过来的就是9个字节。注意:网络传输都是UTF-8编码的。
如果对9个字节按照GBK编码码的话,就是4个中文字符加一个字节,所以就出现了如上图所示的乱码情况。
执行 new String(title.getBytes("GBK")  时,应该返回的是10个字节,然后这10个字节又按照UTF-8编码,就是三个中文字符加一个字节,所以就出现了如上图所示的乱码现象。
 
然后我用java程序验证了上面的原理:
@Test
    public void Test0108_22(){
        String input="反扫我";
        try
        {
            System.out.println(input.getBytes("GBK").length);
            System.out.println(input.getBytes("UTF-8").length);
            System.out.println(bytes2HexString(input.getBytes("UTF-8")));
            String title= new String(input.getBytes("UTF-8"),"GBK");
           System.out.println(title); 
           String new_title=new String(new String(title.getBytes("GBK"),"ISO-8859-1").getBytes("ISO-8859-1"),"utf-8" ); 
           System.out.println(new_title);
           System.out.println(bytes2HexString(new_title.getBytes("UTF-8")));
           System.out.println(new_title.getBytes("UTF-8").length);
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
    }
运行结果:

 

图片

 

z总结: "反扫我"这三个中文字符,如果按照GBK 编码,就是6个字节;如果按照UTF-8编码,就是9个字节;
实际上,  request.setCharacterEncoding(" UTF-8 ");   就是解码的过程,即告诉程序把9个字节按照 " UTF-8 " 解码,这样就ok了。
网站中中文的编码一般有如下三种情况
(1)UTF-8
(2)GBK
(3)GB2312

你可能感兴趣的:(jsp,Web,中文,乱码,gbk)