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 // 创建简体中文对应的Charset Charset cn = Charset.forName("UTF-8"); // 获取cn对象对应的编码器和解码器 CharsetEncoder cnEncoder = cn.newEncoder(); CharsetDecoder cnDecoder = cn.newDecoder(); // 创建一个CharBuffer对象 CharBuffer cbuff = CharBuffer.allocate(20); cbuff.put('随'); cbuff.put('便'); cbuff.flip(); // 将CharBuffer中的字符序列转换成字节序列 ByteBuffer bbuff = cnEncoder.encode(cbuff); // 循环访问ByteBuffer中的每个字节 for (int i = 0; i < bbuff.capacity(); i++) { System.out.print(bbuff.get(i) + " "); } // 将ByteBuffer的数据解码成字符序列 System.out.println("\n" + cnDecoder.decode(bbuff)); }}
2 回答
噜噜哒
TA贡献1784条经验 获得超7个赞
由于使用UTF-8和GBK编码在把字符CharBuffer转成ByteBuffer时候分配的字节容量capacity不一样导致的,如果你设置的编码是UTF-8,那么在在执行cnEncoder.encode(cbuff),分配字节容量的源码如下所示:
int n = ( int )(in.remaining() * averageBytesPerChar()); ByteBuffer out = ByteBuffer.allocate(n); |
UTF-8编码情况下,分配的时候,capacity会比limit大,而GBK下,capacity和limit是一样大。所以UTF-8情况下,在遍历字节序列的时候, 会出现溢出,而GBK不会。所以,你在循环遍历字节序列的时候把判断条件bbuff.capacity()换成bbuff.limit()就可以了。
添加回答
举报
0/150
提交
取消