zoukankan      html  css  js  c++  java
  • 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("胡春春和阿珠");
  • 相关阅读:
    网站安全编程 黑客入侵 脚本黑客 高级语法入侵 C/C++ C# PHP JSP 编程
    【算法导论】贪心算法,递归算法,动态规划算法总结
    cocoa2dx tiled map添加tile翻转功能
    8月30日上海ORACLE大会演讲PPT下载
    【算法导论】双调欧几里得旅行商问题
    Codeforces Round #501 (Div. 3) B. Obtaining the String (思维,字符串)
    Codeforces Round #498 (Div. 3) D. Two Strings Swaps (思维)
    Educational Codeforces Round 89 (Rated for Div. 2) B. Shuffle (数学,区间)
    洛谷 P1379 八数码难题 (BFS)
    Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords (贪心)
  • 原文地址:https://www.cnblogs.com/huchun/p/10224519.html
Copyright © 2011-2022 走看看