A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2017-11-29 13:51 编辑

       首先在servlet里,常用传参的方式有get和post,在乱码的处理上这两种方式是有区别的,在了解如何处理之前,先谈谈这种区别是如何产生的,而想要弄明白产生这种区别的原因,需要先了解的是:{:8_494:}
        GET方式的参数在请求行上,在进入Servlet的时候就已经获得参数了;
        POST方式的参数在请求体内,需要request.getParameter()来获得参数;
        而在request接收参数的时候,数据封装到Servlet中的request中,request有一个缓冲区会将接收的数据进行字符集ISO-8859-1编码,而我们的workspace使用的是UTF-8的编码,所以,我们需要设定request的缓存区的字符集,
        设置request的缓存区代码:request.setCharacterEncoding("UTF-8");{:8_492:}
        这样就可以解决post方式的乱码问题,但是却无法解决GET方式的乱码,这是因为: request.setCharacterEncoding("字符集") 必须用在 request.getParameter() 获得参数之前,否则是无效,request.getParameter()之后,参数已经经过了request的缓冲区,我们再设定字符集就没有意义了;{:8_487:}
        GET方式的参数在请求行上,在进入Servlet的时候就已经被获取了,所以不可以用request.setCharacterEncoding("字符集");而POST方式的参数在请求体内在 request.getParameter() 之前不会经过request的缓冲区,所以可以用 request.setCharacterEncoding("字符集")的方式来解决乱码;
        GET方式解决乱码的问题,有三种的解决方法,这里就稍微提一下:
            方案1(极其不推荐):修改tomcat的字符集的编码
            方案2(不推荐):使用URLEncoder和URLDecoder进行编码和解码的操作,将request中被ISO-8859-1解码出的字符串再用ISO-8859-1编码回去,之后再用UTF-8解码
URLEncoder.encode()  和    URLDecoder.decode();
                先用URLDecoder.decode(String s ,"ISO-8859-1");编码
                然后用URLEncoder.encode(String s ,"UTF-8");进行解码
           方案3(推荐):使用String类的一个构造方法  String(byte[] bytes,String charsetName) :通过制定的字符集对字节数组进行解码:                  String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");   
    下面贴出request和response解决中文乱码问题的方法,可以直接取用:
        request:
            GET方式:
                String 参数 = new String(request.getParameter("参数").getBytes("ISO-8859-1"),"UTF-8");
            POST方式:
                request.setCharactEncoding("UTF-8")
        response:
            response输出响应内容中文解决乱码的方法:
                ServletOutputStream  getOutputStream():字节流
                设置中文转成字节数组的时候的编码:write("中文".getBytes("UTF-8"))
                设置浏览器默认打开的时候编码:response.setHeader("Content-Type","text/html;charset=UTF-8")      
                PrintWriter  getWriter():字符流
                解决字符流乱码的封装方法:response.setContentType("text/html;charset=UTF-8");

    补充:框架中,也有对解决中文乱码问题的封装,例如Struts2的struts.xml中配置常量的方法   


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马