Request和Response中文乱码问题的解决方案和区分

首先,在刚接触这个中文乱码问题的时候,还是比较混乱的,因为针对request和response各自都有自己的解决方案,而且思路相似,方法也很相似,又针对get和post两种提交方式,分两种解决中文乱码的方案;针对response响应,分字节流和字符流的响应方式,所以,是两个大的方向,四个小的方向。

 

一:Request对象接收中文数据

1.1Post方式接收中文

 

/**
 *  演示Post方式提交,解决中文乱码问题
 */
public class RequestDemo extends HttpServlet {
     
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 产生乱码的原因:
         * post提交的数据在请求体中,request对象接收到数据之后,会将数据放入到request缓冲区,缓冲区有默认编码:ISO-8859-1:不支持中文;
         * 
         * 解决方案:
         * 将request缓冲区的编码更改就行了
         * 
         */
        request.setCharacterEncoding("UTF-8");
        String parameter = request.getParameter("name");
        System.out.println("姓名:"+parameter);
        
    }

 

1.2get方式提交接收中文

        /**
         * 产生乱码的原因:
         * get提交的数据在请求行url后面,在地址栏其实已经进行了一次编码(默认:ISO-8859-1:对中文不友好)
         * 
         * 解决方案:
         * 将存入request缓冲区的数据以默认的方式接收,但以UTF-8的方式解码
         */
        String name=request.getParameter("name");
        String param=new String(name.getBytes("ISO-8859-1"),"UTF-8");
        System.out.println("姓名:"+parameter);

 

 二:Response响应数据的时候中文乱码问题及解决方案

2.1使用字节流方式响应中文

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        /**
         * 使用字节流响应中文
         */
        //ServletOutputStream outputStream = response.getOutputStream();
        //outputStream.write("中文".getBytes());
        /**
         * 以上这种方式是否能够避免不出现中文乱码问题呢?
         * 不一定:
         * 中文乱码的产生与中文转化成字节数组和浏览器打开方式(打开时采用的默认字符集)有关
         * 
         * 解决方案:
         * 将中文转化成数组的字符集和浏览器打开时候的字符集一致就行
         */
        
        ServletOutputStream outputStream = response.getOutputStream();
        //设置浏览器打开时默认的字符集
        response.setHeader("Conten-Type", "text/html;charset=UTF-8");
        //设置中文转换成字节组的字符集编码
        outputStream.write("中文大师".getBytes("UTF-8"));

 

 2.2使用字符流的方式响应中文

/**
         * 字符流的方式响应中文
         */
        response.getWriter().print("中文大侠");
        /**
         * 使用上述代码向页面输出中文是否会产生乱码?  
         * 一定乱码  
         * 原因: 
         * 字符流是有缓冲区的,response获得字符流,response设计默认的缓冲区编码是ISO-8859-1。 
         * 解决:  设置response获得字符流缓冲区的编码字符集(这句话体现在:response.getWriter(),详情请看API)和
         *                 设置浏览器默认打开时候采用的字符集一致即可。
         * 
         */
        
        // 设置浏览器打开时默认的字符集
        response.setHeader("Conten-Type", "text/html;charset=UTF-8");
        //设置response获得字符流缓冲区的编码字符集
        response.setCharacterEncoding("UTF-8");
        //响应到浏览器
        response.getWriter().print("胡春春和阿珠");

        //下面是一种简化的方式(推荐记住和掌握)
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().print("胡春春和阿珠");

 

posted @ 2019-01-05 14:52  参宿4  阅读(366)  评论(0编辑  收藏  举报