JAVA 的字符編碼的問題
首先講一講字符集
JDK1.4版本引入了java.nio包加入了Charset類來統一字符集的轉換,字符集給出了雙字節Unicode碼序列與本地字符編碼中采用的字節序列之間的映射
字符集的名稱不區分大小寫,可以用官方名稱或者任何一個別名調用靜態方法forName來獲得Charset
1
Charset charset=Charset.forName("GBK");
Charset的aliases()方法返回一個Set<String>集合,表示該字符集所具有的所有別名

1
Map<String,Charset> map=Charset.availableCharsets();
2
for(String setname:map.keySet()) {
3
System.out.println(setname);
4
}
一旦有了字符集,就可以用他在本地字符串和Unicode字節序列之間轉換
2

3

4

如下將一個字符串編碼為gbk charset.encode(str)函數返回一個ByteBuffer對象
1
String str=new String("曉宇");
2
ByteBuffer buff = charset.encode(str);
3
byte[] bytes=buff.array();
同樣,可以將剛才按照GBK方式編碼的字節流解碼為正確的字符流
2

3

1
ByteBuffer by=ByteBuffer.wrap(bytes, 0, bytes.length);
2
CharBuffer cb=charset.decode(by);//返回一個CharBuffer對象,已經將字節數組轉化為字符數組
3
System.out.println(" "+cb.toString());

2

3

實際上String類中集成了Charset對象的使用,String類有兩個用于編碼和解碼的函數
1
byte[] bytes = str.getBytes("CharsetName"); //將字符串str按照指定名稱的Charset進行編碼成字節數組
2
String str2=new String(bytes,"CharsetName"); //將字節數組按照指定名稱的Charset解碼為字符串

2

在輸入輸出流中有兩個用于將字節流轉化為指定編碼格式的字符流的類 InputStreamReader/OutputStreamReader
這兩個類是讀寫流和讀寫器的橋梁 用法如下
1
InputStreamReader isr = new InputStreamReader(in, "charsetname");
2
BufferedReader br = new BufferedReader(isr);//加入一個BufferedReader,可以用到該類的readLine()

2

該用法在我的另外一篇socket備忘的里面體現了,可將網絡傳過來的utf-8格式編碼的字節流正確的解碼,以至于顯示的時候不會出現亂碼
posted on 2008-02-24 16:44 曉宇 閱讀(524) 評論(0) 編輯 收藏 所屬分類: JAVA基礎