servlet——編碼處理

          字符編碼基本概念:

          JAVA中通常有char、byte、String這幾個(gè)概念。char指的是一個(gè)UNICODE字符,為16位的整數(shù)。byte是字節(jié),字符串在網(wǎng)絡(luò)傳輸或存儲(chǔ)前需要轉(zhuǎn)換為byte數(shù)組。在從網(wǎng)絡(luò)接收或從存儲(chǔ)設(shè)備讀取后需要將byte數(shù)組轉(zhuǎn)換成String。String是字符串,可以看成是由char組成的數(shù)組。String和char為內(nèi)存形式,byte是網(wǎng)絡(luò)傳輸或存儲(chǔ)的序列化形式

          編碼方式的簡介

          String序列化成byte數(shù)組或反序列化時(shí)需要選擇正確的編碼方式。如果編碼方式不正確,就會(huì)得到一些0x3F的值。常用的字符編碼方式有ISO8859_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。ISO8859_1用來編碼拉丁文,它由單字節(jié)(0-255)組成。GB2312、GBK用來編碼簡體中文,它有單字節(jié)和雙字節(jié)混合組成。最高位為1的字節(jié)和下一個(gè)字節(jié)構(gòu)成一個(gè)漢字,最高位為0的字節(jié)是ASCII碼。UTF-8/UTF-16/UTF-32是國際標(biāo)準(zhǔn)UNICODE的編碼方式。   用得最多的是UTF-8,主要是因?yàn)樗趯?duì)拉丁文編碼時(shí)節(jié)約空間。

          Java SE API中關(guān)于編碼操作的常用方法

          String str = "中國";
          // 取得GB2312編碼的字節(jié)
          byte[] bytesGB2312 = str.getBytes("GB2312");
          // 取得平臺(tái)缺省編碼的字節(jié)(windows為GB2312)
          byte[] bytesDefault = str.getBytes();
          // 用指定的編碼將字節(jié)轉(zhuǎn)換成字符串
          String newStr = new String(bytesGB2312, "GB2312");
          // 用平臺(tái)缺省的編碼將字節(jié)轉(zhuǎn)換成字符串(solaris為ISO8859_1,windows為GB2312)
          String newDefaultStr = new String(bytesDefault);
          // 用指定的編碼從字節(jié)流里面讀取字符
          InputStream in = new FileInputStream(new File("1.txt"));
          InputStreamReader reader = new InputStreamReader(in, "GB2312");
          char aChar = (char) reader.read();
          當(dāng)通過瀏覽器向tomcat發(fā)出請求訪問servlet時(shí),服務(wù)器將請求信息和響應(yīng)信息封裝在request和response對(duì)象交給響應(yīng)的servlet處理,程序中的字符串默認(rèn)按ISO-8859的查找和輸出
          案例1.
          提交頁面編碼為:GBKimage
          servlet編碼為系統(tǒng)默認(rèn)
          String username = request.getParameter("username");
          imageSystem.out.println(username); 
          結(jié)果如圖
          分析如下,當(dāng)request.getParameter("username");獲得客戶端表image單信息時(shí),默認(rèn)安裝ISO-8859的編碼解碼,然后輸出到控制臺(tái),出現(xiàn)字符編碼不一致產(chǎn)生亂碼
          解決辦法 是在servlet方法頭部添加
          request.setCharacterEncoding("GBK");
          如圖

          案例2.image

          例如:對(duì)于輸出:response.getwrite().write("中國"),在瀏覽器中顯示亂碼:  
          應(yīng)為response.getwrite().write("中國"),默認(rèn)按照ISO-8859編碼響應(yīng)服務(wù)器發(fā)送“中國”,而我們用的瀏覽器默認(rèn)為GBK或GB2312編碼,從而導(dǎo)致編碼不同產(chǎn)生亂碼

          解決辦法:

          //設(shè)置resposne的碼表image
          response.setCharacterEncoding("UTF-8");

          //并且要通知瀏覽器以相應(yīng)格式打開:
          response.setContentType("text/html;charset=UTF-8");

           

          posted on 2010-04-23 23:28 braden 閱讀(2615) 評(píng)論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          <2010年4月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 修武县| 林芝县| 南乐县| 庄河市| 五家渠市| 乐至县| 隆林| 汽车| 榆社县| 桦川县| 天长市| 长岛县| 东源县| 镇原县| 沙田区| 贺州市| 万盛区| 远安县| 兴化市| 朝阳区| 神农架林区| 松桃| 襄城县| 承德市| 察雅县| 东至县| 阿瓦提县| 德阳市| 满洲里市| 饶平县| 曲麻莱县| 余庆县| 大埔区| 浙江省| 高台县| 广河县| 航空| 旬邑县| 宾川县| 禄劝| 湟源县|