最近遇到一個問題,我用java寫了一個客戶端通過socket向服務器端發送消息,發送的內容是字節流,編碼格式是GBK,服務器在收到消息后,如果格式正確,會返回固定的消息格式,同樣也是字節流,編碼格式也是GBK。
現在問題來了,我怎么把字節流轉換為字符流,當然是要能顯示出中文。於是上網搜了一下,找到一篇博客,網址如下:http://bbs.csdn.net/topics/391939108,代碼如下:
import java.nio.charset.Charset; import java.nio.ByteBuffer; import java.nio.CharBuffer; public class Test{ public static void main(String[] args){ String content = "Hello World.你好世界."; byte[] bs = content.getBytes(); Charset charset = Charset.defaultCharset(); ByteBuffer buf = ByteBuffer.wrap(bs); CharBuffer cBuf = charset.decode(buf); System.out.println(cBuf.toString()); } }
從代碼不難看出,主要是通過ByteBuffer和CharBuffer相互轉換,轉換之前需要設置字符的編碼格式,因為我是在中文Windows下開發,所以默認的編碼格式是GBK,如果你想要設置自己的編碼格式,可以調用Charset的forName函數,參數即編碼格式。
這里還有一個細節需要注意,即從字節到字符轉換時,不難想象當讀取到一個byte小於128時候,直接轉英文。當大於128時,因為是GBK編碼,所以需要兩個連續的字節。
java中編碼格式相互轉換,還是比較麻煩的,我到現在也不是很清楚,只能遇到問題一點點解決。