zoukankan      html  css  js  c++  java
  • request和response的中文乱码问题

    request和response的中文乱码问题
    request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符, 服务器获取到的请求参数的值是乱码;

    response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码;

    乱码产生的原因:

    不管是request乱码还是response乱码,其实都是由于客户端(浏览器)跟服务器端采用的编码格式不一致造成的。

    以request乱码为例:浏览器向服务器发送请求,因为浏览器与服务器之间的通信实质上是socket流,所以要先

    将请求参数(字符)转换成字节,也就是编码过程,服务器接收到请求参数后进行解码(字节转字符),然后

    封装到request对象中。如果客户端的编码与服务器端的解码不统一,就会导致通过request获取到的请求参数

    的值是乱码。

    解决乱码方式:
    一、response乱码
    服务器发给浏览器的数据默认是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集进行解码后显示,如果浏览器的默认解码字符集不是ISO-8859-1,就出现乱码。
    对于response乱码,只需要在服务器端指定一个编码字符集,然后通知浏览器按照这个字符集进行解码就可以了。有三种方式:

    方式1:response.setCharacterEncoding("utf-8”);//设置服务器端的编码,默认是ISO-8859-1;该方法必须在response.getWriter()之前进行设置
                 response.setHeader("contentType", "text/html; charset=utf-8”);//通知浏览器服务器发送的数据格式是text/html,并要求浏览器使用utf-8进行解码。
    
    方式2:response.setContentType("text/html;charset=utf-8”);//等同于response.setHeader("contentType", "text/html; charset=utf-8”);它其实会覆盖
    

         response.setCharacterEncoding("utf-8”) ,在开发中只需要设置response.setContentType("text/html;charset=utf-8”)就可以了。意思是通知浏览器服务器发送的数据 格式是text/html,服务器采用utf-8编码,并要求浏览器使用utf-8进行解码。

    方式3:response.setCharacterEncoding("utf-8”);//设置服务器端的编码为utf-8
                 response.getWriter().println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>”);//要求浏览器使用utf-8进行解码
    

    可以看出,第二种方式是最简便的,这也是我们在开发中最常使用的方式。

    二、request乱码
    从浏览器发起的访问方式有三种:在地址栏直接输入URL访问、点击页面中的超链接访问、提交表单访问。第一种访问方式浏览器默认将参数按照utf-8进行编码,后面两种访问方式浏览器将参数按照当前页面的显示编码进行编码。所以对于request乱码,只需要在服务器端设置相应的解码格式即可。由于访问方式不同,浏览器对参数的编码格式也不同,为了方便处理,通过超链接和表单的访问也规定必须是utf-8格式,即显示当前页面的编码也要使用utf-8,这样浏览器将统一使用utf-8对参数进行编码。
    在服务器端,通过request.setCharacterEncoding("utf-8”)即可设置服务器的解码为utf-8(默认是ISO-8859-1),但是它只对请求体里面的参数有效;如果参数跟在请求行中的uri后边,它就无能为力了。因此请求方式不同,解决乱码的方案也不同。

     1、post方式
    post方式属于表单提交,参数存在于请求体中,通过request.setCharacterEncoding("utf-8”)即可解决乱码。

     2、get方式
    get方式提交的参数会跟在请求行中的uri后边,服务器按照默认的iso-8859-1进行解码,这时候解决乱码有两种办法:
    办法一:修改服务器端对uri参数的默认编码
    在tomcat的server.xml中,设置<Connector ….>元素的属性URIEncoding="UTF-8”即可。(默认没有设置此属性)
    例如:<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8”/>
    注意:
       1、设置<Connector ….>元素的属性useBodyEncodingForURI=“true”,意思是请求体和uri使用相同的编码格式。
       通过设置这两个属性,既可以解决get方式的乱码,又可以解决 post方式的乱码。
       2、通过修改server.xml指定服务器对get和post统一按照utf-8解码,要求tomcat管理下的所有web应用都要使用utf-8编码,
       即所有的jsp、html页面都使用utf-8编码。比如 JSP页面的头信息是这样的:

    <%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>

    <html]]>
    <head]]>

    Insert title here
           办法二:逆向操作
                  参数从浏览器到服务器,经过客户端utf-8编码,服务器端iso-8859-1解码,最终成为乱码。那我们将乱码进行相反的编解码,即可得到正常的参数值。
                例如:String name = request.getParameter("name”);//得到乱码    
                          name = new String(name.getBytes("iso-8859-1"),"utf-8”);//得到正常的name值(post和get都适用)
          注意:name.getBytes();如果不指定编码,默认按照gb2312进行编码。
    

    借鉴于
    https://www.cnblogs.com/Ace-suiyuan008/p/9603317.html

  • 相关阅读:
    在WCF中使用Flag Enumerations
    WCF开发教程资源收集
    [转]WCF 4 安全性和 WIF 简介
    Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]
    Asp.Net Web API 2第十八课——Working with Entity Relations in OData
    Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)
    Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)
    Asp.Net Web API 2第十五课——Model Validation(模型验证)
    函数 生成器 生成器表达式
    函数的进阶
  • 原文地址:https://www.cnblogs.com/anke-z/p/13168382.html
Copyright © 2011-2022 走看看