无题,李商隐,哈哈哈,随便写写
2016-12-16 22:33
211 查看
之前一直记着一个汉字是占两个字节,今天发现不是这样的,utf-8编码一个汉字是3个字节,以下为代码证明(GBK是一个汉字两个字节,这个没做实验)
由此可以看出一个中文的utf-8编码为3字节,如果不使用decode方法,bb.getChar()方法得到的是乱码,decode的方法针对的是缓冲器,无法 对其中的部分字节decode
ByteBuffer的get()方法会使position后移一位,但指定索引时即get(i),position位置不变
从下面程序可以看出get()一次取得一个字节,那么,但char类型不应该是两个字节吗,应该一次取得两个字节才对,我看到网上也有人对此有误解
实际上取得是一个字节没错,但这里是类型转换 ,把byte转换为char,空位以0补齐,所以得到的结果是a, 一个字节表示范围从-128到127,a的对应数字是97,所以一个字节完全可以表示,但char的类型确实是两个字节,但从文件中读取的是byte,并不是按照char类型来读取,只是后来强制转换了
1 RandomAccessFile ra = new RandomAccessFile("F:\\text.txt", "rw"); 2 FileChannel fc = ra.getChannel(); 3 ByteBuffer bb = ByteBuffer.allocate(6); 4 String encoding = System.getProperty("file.encoding"); 5 fc.read(bb); 6 bb.flip(); 7 System.out.println("decode using " + encoding + ":" + Charset.forName(encoding).decode(bb) + " position当前位置:" 8 + bb.position() + " limit:" + bb.limit() + " capa:" + bb.capacity()); 打印结果: decode using UTF-8:中文 position当前位置:6 limit:6 capa:6
由此可以看出一个中文的utf-8编码为3字节,如果不使用decode方法,bb.getChar()方法得到的是乱码,decode的方法针对的是缓冲器,无法 对其中的部分字节decode
ByteBuffer的get()方法会使position后移一位,但指定索引时即get(i),position位置不变
从下面程序可以看出get()一次取得一个字节,那么,但char类型不应该是两个字节吗,应该一次取得两个字节才对,我看到网上也有人对此有误解
System.out.println((char)bb.get() + " position当前位置:" + bb.position() +" limit:"+ bb.limit() + " capa:" + bb.capacity()); 打印结果 : a position当前位置:1 limit:3 capa:6
实际上取得是一个字节没错,但这里是类型转换 ,把byte转换为char,空位以0补齐,所以得到的结果是a, 一个字节表示范围从-128到127,a的对应数字是97,所以一个字节完全可以表示,但char的类型确实是两个字节,但从文件中读取的是byte,并不是按照char类型来读取,只是后来强制转换了
相关文章推荐
- java——HashMap的实现原理,自己实现简单的HashMap
- C 进程死锁
- Linux C Socket
- Valid Parentheses
- 朴素贝叶斯分类应用——文档过滤
- 【我拼搏的2016】选择大于努力
- 【从零开始学习MySql数据库】(2)函数
- Js格式化日期
- winform窗体上的超链接怎么跳转到网页?
- C语言的特点
- 设计模式-简单工厂设计模式与策略模式之java实现
- c ide开发工具
- HDU 1083 二分图匹配
- node+express+mongoDB搭建个人博客 ( 一 )
- 图的应用
- nginx的sysV init脚本
- 烂泥:VMWare Workation双网卡配置IP地址 推荐
- 个人作业
- sprint3(第八天)
- PYTHON-1