網絡傳輸中的編碼與解碼

編寫此篇文章的原因:前端傳遞參數帶加號時,到后端都被轉換成了空格,對此問題比較疑惑,進行資料查找,發現編碼方面比較薄弱,進行學習記錄。

以上問題解決方法:

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進行編碼。

        ?

      ?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容