Ordinary hut

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

          關于web開發過程中的編碼

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

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


          網站導航:
           
          主站蜘蛛池模板: 大名县| 揭阳市| 霞浦县| 华池县| 剑河县| 唐河县| 三都| 万载县| 宝山区| 丰顺县| 昂仁县| 天台县| 西平县| 光山县| 新丰县| 师宗县| 冕宁县| 隆昌县| 新宁县| 尉氏县| 鸡东县| 无极县| 巫溪县| 偃师市| 兴和县| 塔城市| 南充市| 丰县| 平罗县| 张家界市| 获嘉县| 阳原县| 景洪市| 浦城县| 拉萨市| 定州市| 嘉兴市| 隆安县| 深水埗区| 曲阜市| 丰顺县|