网络传输中的编码与解码

编写此篇文章的原因:前端传递参数带加号时,到后端都被转换成了空格,对此问题比较疑惑,进行资料查找,发现编码方面比较薄弱,进行学习记录。

以上问题解决方法:

URLEncoder.encode("参数","utf-8");
URLDecoder.decode("参数","utf-8");

传递参数时进行编码,获取参数后进行解码

原因:到现在还比较迷茫,知道愿意请通知一声,谢谢

字符集与编码方式

字符集(二进制与字符的一一映射)

  1. ASCII (最初的字符集)

  2. GB2312--->GBK--->GB18030(各国字符集)

  3. Unicode(统一字符集)

    ​ * 为了解决Unicode占用硬盘和流量大的问题产生了相关编码方式

    1. utf-8
    2. utf-16

url编码:

  • 概念

    参考:https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81

    URI中允许的字符分为保留字符和非保留字符(RFC 3986中规定的保留字符和非保留字符)

    ​ 保留字符:! * ' ( ) ; : @ & = + $ , / ? # [ ]

    ​ 非保留字符:AZ,az,09,-_.

    如果一个保留字符在特定上下文中具有特殊含义 , 且URI中必须使用该字符用于其它目的, 那么该字符必须百分号编码.

    ! # $ & ' ( ) * + , / : ; = ? @ [ ]
    %21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D
  • 使用

    1.url中的PathInfo

    ​ 实际的url路径编码方式由浏览器决定

    2.url中的QueryString

    ​ 实际的url路径编码方式由浏览器决定

    3.get请求或post 请求Content-Type的值是:application/x-www-form-urlencoded

    ​ 表单提交时,参数中中文的编码则根据HTML代码中指定的字符编码来决定(也就是html代码中标签指定的字符编码)。当然这是在form中没有指定accept-charset的情况下,如果form中加了accept-charset="GBK”属性,则表单参数则由accept-charset指定编码进行编码

Jsp/Servlet编码:

  • 在jsp/servlet中主要有以下几个地方可以设置编码

    • pageEncoding="UTF-8"

      • 设置jsp编译成servlet时使用的编码
      • 例如:jsp文件保存为gbk格式,pageEncoding="UTF-8"时servlet会出现乱码
      • JSP中不指定contentType参数,不使用response.setCharacterEncoding方法时,指定对服务器响应进行重新编码的编码
    • response

      需要设置转换成传输流的编码方式及浏览器的解码方式

      服务器发给浏览器的数据默认是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集进行解码后显示,如果浏览器的默认解码字符集不是ISO-8859-1,就出现乱码。ISO-8859-1不支持中文即传输中文必须采用其他传输方式,否则为乱码

      • response.setCharacterEncoding("utf-8”);
        设置服务器端的编码,默认是ISO-8859-1;该方法必须在response.getWriter()之前进行设置,如果设置了Content-Type字段,response.setCharacterEncoding方法设置的字符集编码会出现在Http消息的响应头中,会要求浏览器使用utf-8进行解码
        response.setHeader("Content-Type", "text/html; ");response.setHeader("Content-Type", "text/html;");
        通知浏览器服务器发送的数据格式是text/html,并要求浏览器使用utf-8进行解码。

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

      • response.setCharacterEncoding("utf-8”);
        设置服务器端的编码为utf-8
        response.getWriter().println("”);
        要求浏览器使用utf-8进行解码,按照整个html格式编写,写在head中。
        可以看出,第二种方式是最简便的,这也是我们在开发中最常使用的方式。setCharacterEncoding优先权比setContentType及setLocale()节点要高

    • request

      会涉及到URL编程,参考url编码

      在服务器端,通过request.setCharacterEncoding("utf-8”)即可设置服务器的解码为utf-8(默认是ISO-8859-1),但是它只对请求体里面的参数有效;如果参数跟在请求行中的uri后边,它就无能为力了。因此请求方式不同,解决乱码的方案也不同。

      • 在地址栏直接输入URL访问

        编码方式由浏览器决定,RFC 3986协议强制要求转换为UTF-8,为了方便处理,通过超链接和表单的访问也规定必须是utf-8格式,即显示当前页面的编码也要使用utf-8,这样浏览器将统一使用utf-8对参数进行编码

      • 点击页面中的超链接访问

        将参数按照当前页面的显示编码进行编码,RFC 3986协议强制要求转换为UTF-8。

      • 提交表单访问

        将参数按照当前页面的显示编码进行编码。

        解决方案:

        • post请求

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

        • 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编码。比如 JSP页面的头信息是这样的:

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

            pageEncoding="utf-8"%>

          • 参数从浏览器到服务器,经过客户端utf-8编码,服务器端iso-8859-1解码,最终成为乱码。那我们将乱码进行相反的编解码,即可得到正常的参数值。

            例如:String name = request.getParameter("name”);//得到乱码

            ​ name = new String(name.getBytes("iso-8859-1"),"utf-8”);//得到正常的name值

            ​ 注意:name.getBytes();如果不指定编码,默认按照gb2312进行编码。

你可能感兴趣的:(网络传输中的编码与解码)