byte輸出簡單解決方法

張國平發表於2010-01-17

現在有一段程式,大概是這樣的:

對輸入的字串str處理:byte[] bb = str.getBytes(),獲得的位元組陣列存進一個ByteBuffer。另有一個執行緒不定期地從Bytebuffer裡取出長度不定的位元組,打包後由訊號傳輸裝置傳輸到另一臺電腦,收到包後再解析。

現在的問題是對英文字串處理沒問題,但中文的不定期出亂碼。我覺得是編碼的問題。用GB2312編碼,getBytes()處理後英文字元對應一個位元組,中文的是兩個。放到ByteBuffer裡後,擷取時可能剛好把中文的兩個位元組分開到兩個包裡了。因為傳輸後對每個包的解析是單獨進行的,直接處理,沒有再把位元組取出來快取後再處理,所以會出現亂碼。

所以我的想法是,能不能判斷ByteButter裡我要擷取的位元組陣列末尾的那個位元組是英文的還是中文的字元產生的。是英文的我就不處理,是中文的就分情況處理。

哪位能給我想個辦法,謝謝~

我簡單做了一個。。用GBK字元庫的char[],代替byte[]
public class strdeal {
public String  getString(){//輸入字串
System.out.println("input string");

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s="";
try {
s = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println(s);//可以直接列印字串
return s;

}
public byte[] getByet(String s){//字串轉為byte[]
byte[] bb = s.getBytes();
return bb;
}
private char[] getChars (byte[] bytes) {//byte轉為char[],使用GBK
     Charset cs = Charset.forName ("GBK");
     ByteBuffer bb = ByteBuffer.allocate (bytes.length);
     bb.put (bytes);
                bb.flip ();
      CharBuffer cb = cs.decode (bb);
 
  return cb.array();
}
public static void main(String args[]){//簡單測試
strdeal sdeal=new strdeal();
//System.out.println(sdeal.getString());

byte[] arrbyte=sdeal.getByet(sdeal.getString());
char[] arrchar=sdeal.getChars(arrbyte);
/*for(byte b:arrbyte){
System.out.print(b);
}*/
for(char c:arrchar){
System.out.print(c);
}
System.out.println();
String res=new String(arrbyte);
System.out.println(res);
}

}

/*輸出
input string
ABC124不是麼
ABC124不是麼
*/


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-625293/,如需轉載,請註明出處,否則將追究法律責任。

相關文章