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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-5-23 16:47 编辑

请求和响应中乱码的处理


解决向页面输出中文的乱码问题!!!
        * 在响应前设置


          response.setContentType("text/html;charset=UTF-8");


1.request请求解决乱码:         
        1.1POST的解决方案:
                * POST的参数在请求体中,直接到达后台的Servlet.数据封装到Servlet中的request中.
                  request也有一个缓冲区.request的缓冲区也是ISO-8859-1编码.
                * 设置request的缓冲区的编码:
                        * request.setCharacterEncoding(“UTF-8”); --- 一定要在接收参数之前设置编码就OK.
        1.2GET的解决方案:
                * 1.修改tomcat的字符集的编码.(不推荐)
                * 2.使用URLEncoder和URLDecoder进行编码和解码的操作.
                        filename = URLEncoder.encode(filename,"utf-8");
                        
               
                * 3.使用String的构造方法:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");        


2.response响应解决乱码:
2.1.字节流:
        * 设置浏览器默认打开编码
          response.setHeader("Content-Type", "text/html;charset=UTF-8");
        * 中文转成字节数组编码
          response.getOutputStream().write("王守义".getBytes("UTF-8"));
2.2.字符流:
        * 设置response的缓冲区的编码
          response.setCharacterEncoding("UTF-8");
        * 设置浏览器默认打开的编码.
          response.setHeader("Content-Type", "text/html;charset=UTF-8");
          response.setContentType("text/html;charset=UTF-8");相当于上面两句


3.1下载时文件名乱码的解决:
针对不同的浏览器进行不同的编码
                if(agent.contains("Firefox")){
                        //版本信息包含Firefox时,说明为火狐浏览器
                        filename = base64EncodeFileName(filename);
                }else{
                        //其它浏览器
                        filename = URLEncoder.encode(filename,"UTF-8");
                }
               
                        // 2.设置Content-Disposition头,这样下载的时候显示的文件名就是正常的中文了
                response.setHeader("Content-Disposition", "attachment;filename="+filename);


               
1.提交 中文乱码的问题:(request接受参数)
        问题:
                * 表单提交的时候,get和post两种方式提交'中文'都是乱码
               
        解决办法:
        * POST的解决方案:
                * 分析:
                        * 因为request缓冲区默认编码为'ISO-8859-1'这个编码不认识中文,当请求体里的中存到reuquest中时,
                          就会变成乱码,当再从缓冲区取出时,更是乱码;
                        * POST的参数在请求体中,直接到达后台的Servlet.数据封装到Servlet中的request中,
                          request也有一个缓冲区.request的缓冲区也是ISO-8859-1编码.
                * 设置request的缓冲区的编码:
                        * request.setCharacterEncoding(“UTF-8”);  --- 一定要在接收参数之前设置编码就OK.
        
        * GET的解决方案:
                * 分析:
                        get方式提交数据时,要先被编码到地址栏中,再将信息存入request缓冲中,字从缓冲区值取出数据.
                * 1.修改tomcat的字符集的编码.(不推荐)
                * 2.使用URLEncoder和URLDecoder进行编码和解码的操作.(???怎么用)
                * 3.使用String的构造方法和获取字节数组的方法:
                        
                        * String(byte[] bytes, Charset charset)
                                通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
                        * byte[] getBytes(String charsetName)
                                使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
                        * 两个方法组合使用:
                                String(getBytes(String charsetName), Charset charset)
        
例:
/**
* 使用request解决中文乱码的问题:
*/
public class RequestServlet2 extends HttpServlet {
        private static final long serialVersionUID = 1L;
      
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                /*String name = request.getParameter("name");
                String ss = new String(name.getBytes("ISO-8859-1"),"UTF-8");*/
               
                String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
                System.out.println("GET方式:"+name);
        }


        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                request.setCharacterEncoding("UTF-8");
                String name = request.getParameter("name");
                System.out.println("POST方式:"+name);
        }
}






2.响应中文 出现乱码


2.1字符流:
        问题:
                使用字符流输出中文:
          * 有没有乱码?为什么?
              * 一定会乱码.response使用的字符流有缓冲区的.
              * response的字符流的缓冲区的默认的编码是ISO-8859-1.编码根本不支持中文.
         * 解决:
                   * 设置response的字符流的缓冲区的编码.
              * 设置浏览器默认打开的时候采用的字符集编码.
        格式:        
                * 第一种:
                        response.setHeader("Content-Type", "text/html;charset=UTF-8"); // 设置浏览器默认打开的时候采用的字符集编码
                        response.setCharacterEncoding("UTF-8");// 设置response的字符流的缓冲区的编码.
                * 第二种:
                        response.setContentType("text/html;charset=UTF-8"); //简化写法
                        response.getWriter().println("中文");
                  
2.2字节流:
        原因:
                使用字节流输出中文:
          * 有没有乱码?为什么?
            * 不一定.
          * 解决:        
                        * 设置浏览器默认打开的时候采用的字符集编码
                        response.setHeader("Content-Type", "text/html;charset=UTF-8");
                        * 设置中文转成字节数组的时候取出的编码
                        response.getOutputStream().write("中文".getBytes("UTF-8"));
                        
                        
                        * 当使用浏览器打开文本文档时,gb2312格式的文档可
                          以和String s = new String("中文".getBytes("gb2312"));格式的文字同时打开;
        
        格式:               
                response.setHeader("Content-Type", "text/html;charset=UTF-8"); // 设置浏览器默认打开的时候采用的字符集编码
                response.getOutputStream().write("中文".getBytes("UTF-8")); // 设置中文转成字节数组的时候取出的编码
                        
例:                  
/**
* 向页面做出响应的Servlet
*/
public class OutPrintServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;


        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                test4(response);
        }
        /**
         * 使用字符流输出中文:
         * * 有没有乱码?为什么?
         *     * 一定会乱码.response使用的字符流有缓冲区的.
         *     * response的字符流的缓冲区的默认的编码是ISO-8859-1.编码根本不支持中文.
         * * 解决:
         *            * 设置response的字符流的缓冲区的编码.
         *     * 设置浏览器默认打开的时候采用的字符集编码.
         * @param response
         * @throws IOException
         */
        private void test4(HttpServletResponse response) throws IOException {
                // 设置浏览器默认打开的时候采用的字符集编码
                //response.setHeader("Content-Type", "text/html;charset=UTF-8");
                // 设置response的字符流的缓冲区的编码.
                //response.setCharacterEncoding("UTF-8");
               
                response.setContentType("text/html;charset=UTF-8"); //简化写法
                response.getWriter().println("中文");
        }
        
        /**
         * 使用字节流输出中文:
         * * 有没有乱码?为什么?
         *    * 不一定.
         *    * 解决:
         *       * 设置中文转成字节数组取出的时候的编码
         *       * 设置浏览器默认打开的时候编码
         * @param response
         * @throws IOException
         */
        private void test3(HttpServletResponse response) throws IOException {
                // 设置浏览器默认打开的时候采用的字符集编码
                response.setHeader("Content-Type", "text/html;charset=UTF-8");
                // 设置中文转成字节数组的时候取出的编码
                response.getOutputStream().write("中文".getBytes("UTF-8"));
        }
        /**
         * 使用字符流响应数据:
         * @param response
         * @throws IOException
         */
        private void test2(HttpServletResponse response) throws IOException {
                response.getWriter().println("Hello Writer Response...");
        }        
        /**
         * 使用字节流响应数据:
         * @param response
         * @throws IOException
         */
        private void test1(HttpServletResponse response) throws IOException {
               
                response.getOutputStream().write("Hello OutputStream Response...".getBytes());
        }


        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                doGet(request, response);
        }


}

0 个回复

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