posts - 56,  comments - 12,  trackbacks - 0
          UTF8轉(zhuǎn)換成GB2312 當我們在基于HTTP協(xié)議的JSP或Servlet的應用中獲取數(shù)據(jù)或發(fā)送請求時,JVM會把輸送的數(shù)據(jù)編碼成UTF8格式。如果我們直接從HTTP流中 提取中文數(shù)據(jù),提取的結(jié)果為“????”(可能更多問號),為轉(zhuǎn)換成我們能夠理解的中文字符,我們需要把UTF8轉(zhuǎn)換成GB2312,借助ISO- 8859-1標準編碼能夠輕易的實現(xiàn),下面的代碼實現(xiàn)了這一功能:

          byte [] b;

          String utf8_;

          utf8_ = request.getParameter("NAME");//從HTTP流中取"NAME"的UTF8數(shù)據(jù)

          b = utf8_.getBytes("8859_1"); //中間用ISO-8859-1過渡

          String name = new String(b, "GB2312"); //轉(zhuǎn)換成GB2312字符

          在 知道流長度的情況下將輸入流轉(zhuǎn)換成字節(jié)數(shù)組 Java中的輸入流抽象類InputStream有int read(byte[] b, int off, int len)方法,參數(shù)中byte[] b是用來存放從InputStream中讀取的數(shù)據(jù),int off指定數(shù)組b的偏移地址,也就是數(shù)組b的起始下標,int len指定需要讀取的長度,方法返回實際讀取的字節(jié)數(shù)。剛學Java的朋友可能要說:先定義一個與流長度等長的字節(jié)數(shù)組,調(diào)用read方法,指定起始下標 為0,指定讀取長度與數(shù)組長度等長,不是一下子可以讀出來了嗎?說的沒錯,筆者曾經(jīng)也試著這樣讀取數(shù)據(jù),但后來發(fā)現(xiàn)在讀取網(wǎng)絡數(shù)據(jù)時很不安全,我們想想在 網(wǎng)絡上獲取數(shù)據(jù)可能并沒那么流暢,數(shù)據(jù)流的傳送可能會斷斷續(xù)續(xù),所以并不能保證一次就能讀取全部數(shù)據(jù),特別是在讀取大容量數(shù)據(jù)時更是如此,所以我們必須在 讀取數(shù)據(jù)時檢測實際讀到的長度,如果沒有讀完已知長度的數(shù)據(jù)就應該再次讀取,以此循環(huán)檢測,直到實際讀取的長度累加與已知的長度相等,下面的代碼實現(xiàn)了這 一功能:

          ServletInputStream inStream = request.getInputStream(); //取HTTP請求流

          int size = request.getContentLength(); //取HTTP請求流長度

          byte[] buffer = new byte[size]; //用于緩存每次讀取的數(shù)據(jù)

          byte[] in_b = new byte[size]; //用于存放結(jié)果的數(shù)組

          int count = 0;

          int rbyte = 0;

          while (count < size) { //循環(huán)讀取

          rbyte = inStream.read(buffer); //每次實際讀取長度存于rbyte中

          for(int i=0;i<rbyte;i++) {

          in_b[count + i] = buffer[i];

          }

          count += rbyte;

          }

          在 不知道流長度的情況下將輸入流轉(zhuǎn)換成字節(jié)數(shù)組 前面介紹了已知流長度的情況下的轉(zhuǎn)換方法,那么當我們不知道流有多長時,也就是說不能確定轉(zhuǎn)換后的字節(jié)數(shù)組有多大時,該怎么處理呢?筆者查看了JDK文檔 之后發(fā)現(xiàn)ByteArrayOutputStream有一個byte[] toByteArray()方法,該方法會自動創(chuàng)建一個字節(jié)數(shù)組,然后返回。于是就巧妙的用ByteArrayOutputStream來作中間過渡實現(xiàn) 轉(zhuǎn)換,其它處理跟上面所介紹已知長度的情況差不多。假設需要被轉(zhuǎn)換的流已經(jīng)放在inStream里了,我們可以用如下的代碼實現(xiàn)這一功能:

          ByteArrayOutputStream swapStream = new ByteArrayOutputStream();

          byte[] buff = new byte[100]; //buff用于存放循環(huán)讀取的臨時數(shù)據(jù)

          int rc = 0;

          while ((rc = inStream.read(buff, 0, 100)) > 0) {

          swapStream.write(buff, 0, rc);

          }

          byte[] in_b = swapStream.toByteArray(); //in_b為轉(zhuǎn)換之后的結(jié)果

          posted on 2007-01-19 00:07 苦笑枯 閱讀(252) 評論(0)  編輯  收藏 所屬分類: Java
          收藏來自互聯(lián)網(wǎng),僅供學習。若有侵權(quán),請與我聯(lián)系!

          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(2)

          隨筆分類(56)

          隨筆檔案(56)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 怀仁县| 乌拉特中旗| 盐边县| 东莞市| 基隆市| 赣榆县| 芮城县| 靖西县| 定陶县| 永平县| 德惠市| 景德镇市| 昌江| 永修县| 长乐市| 澄城县| 江陵县| 太湖县| 松阳县| 鹤峰县| 进贤县| 当涂县| 门源| 报价| 镇赉县| 和平区| 秭归县| 抚顺市| 松原市| 陇南市| 汉源县| 寿阳县| 增城市| 苗栗市| 四会市| 金川县| 南华县| 香港| 石家庄市| 富平县| 尼玛县|