zoukankan      html  css  js  c++  java
  • request、response 中文乱码问题与解决方式

    request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码;
     
    response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码;
     
    乱码产生的原因:不管是request乱码还是response乱码,其实都是由于客户端(浏览器)跟服务器端采用的编码格式不一致造成的。以request乱码为例:浏览器向服务器发送请求,因为浏览器与服务器之间的通信实质上是socket流,所以要先将请求参数(字符)转换成字节,也就是编码过程,服务器接收到请求参数后进行解码(字节转字符),然后封装到request对象中。如果客户端的编码与服务器端的解码不统一,就会导致通过request获取到的请求参数的值是乱码。
     
    解决:
    一、response乱码
    服务器发给浏览器的数据默认是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集进行解码后显示,如果浏览器的默认解码字符集不是ISO-8859-1,就出现乱码。
        对于response乱码,只需要在服务器端指定一个编码字符集,然后通知浏览器按照这个字符集进行解码就可以了。有三种方式:
        1、A、设置服务器端的编码
       response.setCharacterEncoding("utf-8”);
       默认是ISO-8859-1;该方法必须在response.getWriter()之前进行设置
       B、通知浏览器服务器发送的数据格式
             response.setHeader("Content-type", "text/html; charset=utf-8”);
        2、A、通知浏览器服务器发送的数据格式
         response.setContentType("text/html;charset=utf-8”);
       等同于response.setHeader("contentType", "text/html; charset=utf-8”);它其实会覆盖response.setCharacterEncoding("utf-8”) ,在开发中只需要设
       B、设置服务器端的编码
       response.setContentType("text/html;charset=utf-8”);
        3、A、设置服务器端的编码
       response.setCharacterEncoding("utf-8”);
       B、浏览器使用utf-8进行解码
             
    总结:设置:
    A、设置服务器端的编码
    response.setCharacterEncoding("utf-8”);
    B、通知浏览器服务器发送的数据格式
    response.setContentType("text/html;charset=utf-8”);
    C、浏览器使用utf-8进行解码
             
    本人就是这样设置的,以防万一;
    二、request乱码
    从浏览器发起的访问方式有三种:在地址栏直接输入URL访问、点击页面中的超链接访问、提交表单访问。第一种访问方式浏览器默认将参数按照utf-8进行编码,后面两种访问方式浏览器将参数按照当前页面的显示编码进行编码。所以对于request乱码,只需要在服务器端设置相应的解码格式即可。由于访问方式不同,浏览器对参数的编码格式也不同,为了方便处理,通过超链接和表单的访问也规定必须是utf-8格式,即显示当前页面的编码也要使用utf-8,这样浏览器将统一使用utf-8对参数进行编码。
    A、post方式
    post方式属于表单提交,参数存在于请求体中。
    request.setCharacterEncoding("utf-8”)
    B、get方式
    get方式提交的参数会跟在请求行中的uri后边,服务器按照默认的iso-8859-1进行解码,这时候解决乱码有两种办法:
    修改服务器端对uri参数的默认编码
    在tomcat的server.xml中,设置元素的属性URIEncoding="UTF-8”即可。(默认没有设置此属性)
    例如:注意:1、设置元素的属性useBodyEncodingForURI=“true”,意思是请求体和uri使用相同的编码格式。通过设置这两个属性,既可以解决get方式的乱码,又可以解决     post方式的乱码。2、通过修改server.xml指定服务器对get和post统一按照utf-8解码,要求tomcat管理下的所有web应用都要使用utf-8编码,即所有的jsp、html页面都使用utf-8编码。
     

    首先,response返回有两种,一种是字节流outputstream,一种是字符流printwrite。

    申明:这里为了方便起见,所有输出都统一用UTF-8编码。

    先说字节流,要输出“中国",给输出流的必须是转换为utf-8的“中国”,还要告诉浏览器,用utf8来解析数据

           //这句话的意思,是让浏览器用utf8来解析返回的数据
            response.setHeader("Content-type", "text/html;charset=UTF-8");
            String data = "中国";
            OutputStream ps = response.getOutputStream();
            //这句话的意思,使得放入流的数据是utf8格式
            ps.write(data.getBytes("UTF-8"));
    
    


    再说字符流,要输出中国,需要设置response.setCharacterEncoding("UTF-8");

                   //这句话的意思,是让浏览器用utf8来解析返回的数据
    		response.setHeader("Content-type", "text/html;charset=UTF-8");
    		//这句话的意思,是告诉servlet用UTF-8转码,而不是用默认的ISO8859
    		response.setCharacterEncoding("UTF-8");
    		String data = "中国";
    		PrintWriter pw = response.getWriter();
    		pw.write(data);

    经验:1,如果中文返回出现??字符,这表明没有加response.setCharacterEncoding("UTF-8");这句话。

                2,如果返回的中文是“烇湫”这种乱码,说明浏览器的解析问题,应该检查下是否忘加response.setHeader("Content-type", "text/html;charset=UTF-8");这句话。

  • 相关阅读:
    GNU KHATA——开源的会计管理软件
    Web服务精讲–搭个 Web 服务器(二)
    据说Linuxer都难忘的25个画面
    谷歌开源运作解密
    实战Centos系统部署Codis集群服务
    这些被称为史上最 “贱” 黑客
    Linux 利器- Python 脚本编程入门(一)
    在 Ubuntu 16.04 上安装 LEMP 环境之图文向导
    Linux下6种优秀的邮件传输代理
    移动互联网期末笔记
  • 原文地址:https://www.cnblogs.com/jinzhiming/p/5765672.html
Copyright © 2011-2022 走看看