Ordinary hut

          人間一福地,勝似天仙宮
          posts - 61, comments - 50, trackbacks - 0, articles - 1

          關(guān)于web開發(fā)過程中的編碼

          Posted on 2011-03-02 15:51 landor 閱讀(572) 評論(0)  編輯  收藏 所屬分類: jsp、servletajax
          1 瀏覽器會根據(jù)content="text/html; charset=gbk"來解析該用什么編碼來把這些字節(jié)流decode成字符串,并顯示;
          2 當(dāng)客戶端提交表單的時候,比如以post方式提交,瀏覽器同樣會根據(jù)上面的編碼,把這些字符串encode成字節(jié)流,發(fā)送到服務(wù)端;
          3 在服務(wù)端,默認就會認為傳過來的東西就是ASCii碼,沒別的,也就是ISO-8859-1,所以它就去decode,ISO-8859-1中根本沒有中文漢字對應(yīng)的二進制碼,沒找到,就亂了應(yīng)該是一堆口吧;
          4 解決辦法是加一個過濾器,比如gbk,那就設(shè)置成request.setCharacterEncoding("GBK");這樣服務(wù)端在獲取字符串的時候,就用GBK去decode這個二進制流了;
          5 如果是ajax,問題又來了,因為ajax只支持utf-8編碼格式,過程應(yīng)該是這樣:
              a 瀏覽器通過ajax像server端post數(shù)據(jù)時,ajax自動將瀏覽器中的文字用utf-8 encode成二進制流,然后發(fā)送到server端;
              b server端如果配置的filter是gbk,那么會用gbk去decode這個二進制流,顯然亂麻;但是不應(yīng)該是一堆口,因為他應(yīng)該根據(jù)二進制流的每兩位字節(jié),在GBK編碼表中能找到對應(yīng)的內(nèi)容,具體的內(nèi)容是簡體文字還是繁體文字還是其他的,就不一定了;
                  此時要是偶數(shù)個漢字還好(可以把它用gbk進行encode,然后用utf-8進行decode,這樣就還原回來了),
                  如果是奇數(shù)個漢字就出現(xiàn)丟失了(因為一個字符用UTF-8 encode后為3個字節(jié),如果三個字符被encode之后,就是9個字節(jié),當(dāng)用gbk進行decode 的時候,gbk是用2個字節(jié),結(jié)果剩下了一個字節(jié),這個字節(jié)在gbk的編碼表中不存在(因為gbk編碼表都是2個字節(jié)的),所以就用?號填充了)。
              c 所以必須在服務(wù)端的fiter中對ajax請求進行判斷,用jquery為例:
          $.ajax({
              
              contentType:
          "application/x-www-form-urlencoded;charset=utf-8",

          在server端的filter中,可以判斷charset是不是空,如果加上上面的代碼,那么charset就是utf-8,代碼如下:
          if (request.getCharacterEncoding() == null) {
              request.setCharacterEncoding(this.encoding);//正常提交請求時候,charset是空的,也就是說request.getCharacterEncoding()是空的;
          }

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 阿坝| 琼中| 凤城市| 长岛县| 固安县| 特克斯县| 韶关市| 德清县| 乌海市| 宁安市| 高密市| 天柱县| 松阳县| 宽城| 澄迈县| 高安市| 吉安市| 龙门县| 金寨县| 察隅县| 吉木萨尔县| 昂仁县| 三江| 兴仁县| 延安市| 木里| 芦山县| 云林县| 买车| 若尔盖县| 红原县| 武宁县| 铅山县| 安新县| 灵寿县| 阿坝县| 永康市| 阜康市| 栖霞市| 祁东县| 湟中县|