猿问

您好,请问为什么使用forName("UTF-8")会出错,使用GBK就行呢?

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)); }}

精慕HU
浏览 493回答 2
2回答

噜噜哒

由于使用UTF-8和GBK编码在把字符CharBuffer转成ByteBuffer时候分配的字节容量capacity不一样导致的,如果你设置的编码是UTF-8,那么在在执行cnEncoder.encode(cbuff),分配字节容量的源码如下所示:int&nbsp;n&nbsp;=&nbsp;(int)(in.remaining()&nbsp;*&nbsp;averageBytesPerChar());ByteBuffer&nbsp;out&nbsp;=&nbsp;ByteBuffer.allocate(n);UTF-8编码情况下,分配的时候,capacity会比limit大,而GBK下,capacity和limit是一样大。所以UTF-8情况下,在遍历字节序列的时候,&nbsp;会出现溢出,而GBK不会。所以,你在循环遍历字节序列的时候把判断条件bbuff.capacity()换成bbuff.limit()就可以了。

qq_花开花谢_0

因为eclipse默认的是GBK,GBK和UTF-8貌似有长度上的区别
随时随地看视频慕课网APP
我要回答