網(wǎng)絡(luò)傳輸中的編碼與解碼

編寫此篇文章的原因:前端傳遞參數(shù)帶加號時鹅士,到后端都被轉(zhuǎn)換成了空格券躁,對此問題比較疑惑,進(jìn)行資料查找,發(fā)現(xiàn)編碼方面比較薄弱也拜,進(jìn)行學(xué)習(xí)記錄旭贬。

以上問題解決方法:

URLEncoder.encode("參數(shù)","utf-8");
URLDecoder.decode("參數(shù)","utf-8");

傳遞參數(shù)時進(jìn)行編碼,獲取參數(shù)后進(jìn)行解碼

原因:到現(xiàn)在還比較迷茫搪泳,知道愿意請通知一聲稀轨,謝謝

字符集與編碼方式

字符集(二進(jìn)制與字符的一一映射)

  1. ASCII (最初的字符集)

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

  3. Unicode(統(tǒng)一字符集)

    ? * 為了解決Unicode占用硬盤和流量大的問題產(chǎn)生了相關(guān)編碼方式

    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中規(guī)定的保留字符和非保留字符)

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

    ? 非保留字符: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

    ? 表單提交時笙纤,參數(shù)中中文的編碼則根據(jù)HTML代碼中指定的字符編碼來決定(也就是html代碼中<meta>標(biāo)簽指定的字符編碼)航闺。當(dāng)然這是在form中沒有指定accept-charset的情況下,如果form中加了accept-charset="GBK”屬性异旧,則表單參數(shù)則由accept-charset指定編碼進(jìn)行編碼

Jsp/Servlet編碼:

  • 在jsp/servlet中主要有以下幾個地方可以設(shè)置編碼

    • pageEncoding="UTF-8"

      • 設(shè)置jsp編譯成servlet時使用的編碼
      • 例如:jsp文件保存為gbk格式艰赞,pageEncoding="UTF-8"時servlet會出現(xiàn)亂碼
      • JSP中不指定contentType參數(shù)佣谐,不使用response.setCharacterEncoding方法時,指定對服務(wù)器響應(yīng)進(jìn)行重新編碼的編碼
    • response

      需要設(shè)置轉(zhuǎn)換成傳輸流的編碼方式及瀏覽器的解碼方式

      服務(wù)器發(fā)給瀏覽器的數(shù)據(jù)默認(rèn)是按照ISO-8859-1編碼方妖,瀏覽器接收到數(shù)據(jù)后按照默認(rèn)的字符集進(jìn)行解碼后顯示狭魂,如果瀏覽器的默認(rèn)解碼字符集不是ISO-8859-1,就出現(xiàn)亂碼党觅。ISO-8859-1不支持中文即傳輸中文必須采用其他傳輸方式雌澄,否則為亂碼

      • response.setCharacterEncoding("utf-8”);
        設(shè)置服務(wù)器端的編碼,默認(rèn)是ISO-8859-1杯瞻;該方法必須在response.getWriter()之前進(jìn)行設(shè)置,如果設(shè)置了Content-Type字段镐牺,response.setCharacterEncoding方法設(shè)置的字符集編碼會出現(xiàn)在Http消息的響應(yīng)頭中,會要求瀏覽器使用utf-8進(jìn)行解碼
        response.setHeader("Content-Type", "text/html; ");response.setHeader("Content-Type", "text/html;");
        通知瀏覽器服務(wù)器發(fā)送的數(shù)據(jù)格式是text/html魁莉,并要求瀏覽器使用utf-8進(jìn)行解碼睬涧。

      • response.setContentType("text/html;charset=utf-8”);response.setHeader("Content-Type", "text/html; charset=utf-8”);
        它其實會覆蓋response.setCharacterEncoding("utf-8”) ,在開發(fā)中只需要設(shè)置response.setContentType("text/html;charset=utf-8”)就可以了旗唁。意思是通知瀏覽器服務(wù)器發(fā)送的數(shù)據(jù)格式是text/html畦浓,服務(wù)器采用utf-8編碼,并要求瀏覽器使用utf-8進(jìn)行解碼检疫。

      • response.setCharacterEncoding("utf-8”);
        設(shè)置服務(wù)器端的編碼為utf-8
        response.getWriter().println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>”);
        要求瀏覽器使用utf-8進(jìn)行解碼,按照整個html格式編寫讶请,寫在head中。
        可以看出电谣,第二種方式是最簡便的秽梅,這也是我們在開發(fā)中最常使用的方式。setCharacterEncoding優(yōu)先權(quán)比setContentType及setLocale()節(jié)點要高

    • request

      會涉及到URL編程剿牺,參考url編碼

      在服務(wù)器端企垦,通過request.setCharacterEncoding("utf-8”)即可設(shè)置服務(wù)器的解碼為utf-8(默認(rèn)是ISO-8859-1),但是它只對請求體里面的參數(shù)有效晒来;如果參數(shù)跟在請求行中的uri后邊钞诡,它就無能為力了。因此請求方式不同,解決亂碼的方案也不同荧降。

      • 在地址欄直接輸入URL訪問

        編碼方式由瀏覽器決定接箫,RFC 3986協(xié)議強(qiáng)制要求轉(zhuǎn)換為UTF-8,為了方便處理朵诫,通過超鏈接和表單的訪問也規(guī)定必須是utf-8格式辛友,即顯示當(dāng)前頁面的編碼也要使用utf-8,這樣瀏覽器將統(tǒng)一使用utf-8對參數(shù)進(jìn)行編碼

      • 點擊頁面中的超鏈接訪問

        將參數(shù)按照當(dāng)前頁面的顯示編碼進(jìn)行編碼剪返,RFC 3986協(xié)議強(qiáng)制要求轉(zhuǎn)換為UTF-8废累。

      • 提交表單訪問

        將參數(shù)按照當(dāng)前頁面的顯示編碼進(jìn)行編碼。

        解決方案:

        • post請求

          post方式屬于表單提交脱盲,參數(shù)存在于請求體中邑滨,通過request.setCharacterEncoding("utf-8”)即可解決亂碼。

        • get方式

          get方式提交的參數(shù)會跟在請求行中的uri后邊钱反,服務(wù)器按照默認(rèn)的iso-8859-1進(jìn)行解碼掖看,這時候解決亂碼有兩種辦法:

          • 修改服務(wù)器端對uri參數(shù)的默認(rèn)編碼

            在tomcat的server.xml中,設(shè)置<Connector ….>元素的屬性URIEncoding="UTF-8”即可面哥。(默認(rèn)沒有設(shè)置此屬性)

            注意:

            1哎壳、設(shè)置<Connector ….>元素的屬性useBodyEncodingForURI=“true”,意思是請求體和uri使用相同的編碼格式幢竹。通過設(shè)置這兩個屬性耳峦,既可以解決get方式的亂碼,又可以解決 post方式的亂碼焕毫。

            2、通過修改server.xml指定服務(wù)器對get和post統(tǒng)一按照utf-8解碼驶乾,要求tomcat管理下的所有web應(yīng)用都要使用utf-8編碼邑飒,即所有的jsp、html頁面都使用utf-8編碼级乐。比如 JSP頁面的頭信息是這樣的:

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

            ? pageEncoding="utf-8"%>

          • 參數(shù)從瀏覽器到服務(wù)器疙咸,經(jīng)過客戶端utf-8編碼,服務(wù)器端iso-8859-1解碼风科,最終成為亂碼撒轮。那我們將亂碼進(jìn)行相反的編解碼,即可得到正常的參數(shù)值贼穆。

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

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

            ? 注意:name.getBytes()题山;如果不指定編碼,默認(rèn)按照gb2312進(jìn)行編碼故痊。

        ?

      ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顶瞳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慨菱,老刑警劉巖焰络,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異符喝,居然都是意外死亡闪彼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門协饲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畏腕,“玉大人,你說我怎么就攤上這事囱稽〗汲ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵战惊,是天一觀的道長流昏。 經(jīng)常有香客問我,道長吞获,這世上最難降的妖魔是什么况凉? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮各拷,結(jié)果婚禮上刁绒,老公的妹妹穿的比我還像新娘。我一直安慰自己烤黍,他們只是感情好知市,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著速蕊,像睡著了一般嫂丙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上规哲,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天跟啤,我揣著相機(jī)與錄音,去河邊找鬼唉锌。 笑死隅肥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袄简。 我是一名探鬼主播腥放,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痘番!你這毒婦竟也來了捉片?” 一聲冷哼從身側(cè)響起平痰,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伍纫,沒想到半個月后宗雇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡莹规,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年赔蒲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片良漱。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡舞虱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出母市,到底是詐尸還是另有隱情矾兜,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布患久,位于F島的核電站椅寺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蒋失。R本人自食惡果不足惜返帕,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篙挽。 院中可真熱鬧荆萤,春花似錦、人聲如沸铣卡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煮落。三九已至梧油,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間州邢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工褪子, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留量淌,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓嫌褪,卻偏偏與公主長得像呀枢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笼痛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容