public class CharsetTransform { public static void main(String[] args) throws Exception {// Properties properties = System.getProperties();// for (Object key : properties.keySet()) {// String name = (String) key;// System.out.println(name + "------>" + properties.get(key));// } //file.encoding------>UTF-8 // 創(chuàng)建簡體中文對(duì)應(yīng)的Charset Charset cn = Charset.forName("UTF-8"); // 獲取cn對(duì)象對(duì)應(yīng)的編碼器和解碼器 CharsetEncoder cnEncoder = cn.newEncoder(); CharsetDecoder cnDecoder = cn.newDecoder(); // 創(chuàng)建一個(gè)CharBuffer對(duì)象 CharBuffer cbuff = CharBuffer.allocate(20); cbuff.put('隨'); cbuff.put('便'); cbuff.flip(); // 將CharBuffer中的字符序列轉(zhuǎn)換成字節(jié)序列 ByteBuffer bbuff = cnEncoder.encode(cbuff); // 循環(huán)訪問ByteBuffer中的每個(gè)字節(jié) for (int i = 0; i < bbuff.capacity(); i++) { System.out.print(bbuff.get(i) + " "); } // 將ByteBuffer的數(shù)據(jù)解碼成字符序列 System.out.println("\n" + cnDecoder.decode(bbuff)); }}
2 回答

嚕嚕噠
TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊
由于使用UTF-8和GBK編碼在把字符CharBuffer轉(zhuǎn)成ByteBuffer時(shí)候分配的字節(jié)容量capacity不一樣導(dǎo)致的,如果你設(shè)置的編碼是UTF-8,那么在在執(zhí)行cnEncoder.encode(cbuff),分配字節(jié)容量的源碼如下所示:
int n = ( int )(in.remaining() * averageBytesPerChar()); ByteBuffer out = ByteBuffer.allocate(n); |
UTF-8編碼情況下,分配的時(shí)候,capacity會(huì)比limit大,而GBK下,capacity和limit是一樣大。所以UTF-8情況下,在遍歷字節(jié)序列的時(shí)候, 會(huì)出現(xiàn)溢出,而GBK不會(huì)。所以,你在循環(huán)遍歷字節(jié)序列的時(shí)候把判斷條件bbuff.capacity()換成bbuff.limit()就可以了。
添加回答
舉報(bào)
0/150
提交
取消