浏览器与服务器之间中文传输乱码问题分析与解决

2 篇文章 0 订阅
2 篇文章 0 订阅
1.乱码问题:
    解决问题的关键是:编码和解码用的是同一张码表,并且该码表支持中文;所以,当出现
    乱码问题时,我们就从两个方面分析:1,编码解码是不是同一张码表,2码表是否支持中文;

2.参数传递过程:
                        ----->request对象
    浏览器----->服务器                        ----->servlet
                        ----->request对象
                    
3.乱码问题的分析与解决:
    =====================request请求中文乱码问题解决========================
    request请求参数概述:
            在浏览器端request请求使用URL编码方式(其实是基于UTF-8)将请求编码    发送到服
        务器,服务器接收到数据之后,首先将请求行用默认编码表(iso8859-1)进行解码,然后会
        访问request.setCharacterEncoding("字符集");的结果,如果传入了字符集,那么会
        使用传入的字符集对请求体(此处暂不讨论请求头解码)进行解码,否则用默认编码表
        (iso8859-1)对请求体进行解码;
            由于浏览器端将get请求和post请求的参数一个封装在请求行,一个封装在请求体,并且
        到服务器端,会将请求行和请求体的解码分别对待,所以下满对get请求和post请求中文乱码
        问题分别讨论:
        
        a> get请求:
            ------------------------------get请求以下------------------------------------
            1,get请求的参数会跟在地址后边,形成请求会在请求行里边,用UTF-8编码,到服务器端以后
            会不加判断直接使用iso8859-1码表进行解码,由于编码解码的码表不一致,直接导致乱码,所以
            这个时候我们:
            //首先获取参数:    
            String value = request.getParameter(String name);
            //其次用iso8859-1将得到的乱码字符 编码回到原来浏览器传过来的二进制形式:
            byte[] bytes =  value.getBytes("iso8859-1");
            //最后我们用浏览器编码时使用的 UTF-8码表进行解码:
            String realStr = new String(bytes , "utf-8");
            ------------------------------get请求以上------------------------------------
        b> post请求:
            ------------------------------post请求以下------------------------------------
            1,post请求的参数在request请求的请求体里边,用UTF-8编码,到服务器端以后,服务器会访问
            request.setCharacterEncoding("字符集");的结果,如果传入了字符集,那么会使用传入的
            字符集对请求体进行解码,否则用默认编码表(iso8859-1)对请求体进行解码;
                基于以上分析,我们可以知道,post对请求体的解码的码表是可以人为干预的,所以我们就要
            在解码是将    
            
            会不加判断直接使用iso8859-1码表进行解码,由于编码解码的码表不一致,直接导致乱码,所以
            这个时候我们要:request.setCharacterEncoding("utf-8"); 这样就保证了浏览器编码,服务器
            解码用的是同一张码表UTF-8,自然也就解决了乱码问题,操作如下:
            
            //设置服务器对请求体解码所用码表:
            request.setCharacterEncoding("utf-8");
            //获得请求参数,此时是没有乱码的:
            String value = request.getParameter(String name);
            ------------------------------post请求以上------------------------------------
    
    =====================response响应中文乱码问题解决========================    
    response响应参数概述:
        服务器端向客户端发送数据有两种方式:字节流,字符流:当我们向浏览器发送字符时,我们首选字
    符流,所以我们先讨论一下字符流:
    
    a> 字符流:
            -----------------------------字符流以下------------------------------------
            
            //设置浏览器打开页面时采用的字符集:
            response.setHeader("Content-Type","text/html;charset=utf-8");
            
            //response里的字符需要编码成二进制然后传到浏览器,下面设编码时所用的码表:
            response.setCharacterEncoding("utf-8");
            
            ------------以上两步的简写形式-------------
            response.setContentType("text/html;charset=utf-8");
            
            
            response.getWriter().write("中国")
            
            -----------------------------字符流以上------------------------------------
    
    b> 字节流:
            -----------------------------字节流以下------------------------------------
            1, 我们要做的就是保证浏览器端解码时用的码表和我们服务器端编码时用的码表是一样的:
            
            //设置浏览器端的解码码表为UTF-8(当然也可以是gbk);
            response.setHeader("Content-Type","text/html;charset=utf-8");
            //在服务器编码时使用UTF-8码表;
            String str = "中国";
            response.getOutputStream().write(str.getBytes("utf-8"));
            
            -----------------------------字节流以上------------------------------------    

    至此,中文乱码问题关闭;
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值