为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

精慕HU 2021-11-02 11:07:03
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()就可以了。


查看完整回答
反对 回复 2021-11-06
?
qq_花开花谢_0

TA贡献1835条经验 获得超6个赞

因为eclipse默认的是GBK,GBK和UTF-8貌似有长度上的区别

查看完整回答
反对 回复 2021-11-06
  • 2 回答
  • 0 关注
  • 427 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信