熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java進階:在Java中將數據由UTF8轉換成GB2312格式

2013-11-23 19:38:57  來源: Java核心技術 

  UTF轉換成GB 當我們在基於HTTP協議的JSP或Servlet的應用中獲取數據或發送請求時JVM會把輸送的數據編碼成UTF格式如果我們直接從HTTP流中提取中文數據提取的結果為????(可能更多問號)為轉換成我們能夠理解的中文字符我們需要把UTF轉換成GB借助ISO標准編碼能夠輕易的實現下面的代碼實現了這一功能

  byte [] b;
  String utf_value;
  utf_value = requestgetParameter(NAME);//從HTTP流中取NAME的UTF數據
  b = utf_valuegetBytes(_); //中間用ISO過渡
  String name = new String(b GB); //轉換成GB字符

  在知道流長度的情況下將輸入流轉換成字節數組 Java中的輸入流抽象類InputStream有int read(byte[] b int off int len)方法參數中byte[] b是用來存放從InputStream中讀取的數據int off指定數組b的偏移地址也就是數組b的起始下標int len指定需要讀取的長度方法返回實際讀取的字節數

  剛學Java的朋友可能要說先定義一個與流長度等長的字節數組調用read方法指定起始下標為指定讀取長度與數組長度等長不是一下子可以讀出來了嗎?說的沒錯筆者曾經也試著這樣讀取數據但後來發現在讀取網絡數據時很不安全我們想想在網絡上獲取數據可能並沒那麼流暢數據流的傳送可能會斷斷續續所以並不能保證一次就能讀取全部數據特別是在讀取大容量數據時更是如此

  ServletInputStream inStream = requestgetInputStream(); //取HTTP請求流
  int size = requestgetContentLength(); //取HTTP請求流長度
  byte[] buffer = new byte[size]; //用於緩存每次讀取的數據
  byte[] in_b = new byte[size]; //用於存放結果的數組
  int count = ;
  int rbyte = ;
   while (count < size) {
    //循環讀取
    rbyte = inStreamread(buffer); //每次實際讀取長度存於rbyte中
    for(int i=;iin_b[count + i] = buffer[i];
    }
    count += rbyte;
  }

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

  ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
  byte[] buff = new byte[]; //buff用於存放循環讀取的臨時數據
  int rc = ;
  while ((rc = inStreamread(buff )) > ) {
   swapStreamwrite(buff rc);
  }
  byte[] in_b = swapStreamtoByteArray(); //in_b為轉換之後的結果


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27229.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.