网络传输中的编码与解码

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

以上问题解决方法:

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代码中<meta>标签指定的字符编码)。当然这是在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("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>”);
        要求浏览器使用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中,设置<Connector ….>元素的属性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"%>

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容