Utf-8编码是如何工作的
来源:互联网 发布:云计算应用的发展方向 编辑:程序博客网 时间:2024/05/17 08:13
转自:http://bigpanda.iteye.com/blog/31890
Utf-8编码是如何工作的讲起。
(JVM规范第4.4.7提了一些,O'Reilly出的Java I/O里讲的比较详细,我手里的是第一版,在第14章,Mutillingual Character Sets and Unicode)
Java用的Unicode用两个字节表示一个charater,字母A用Hex表示是00 41, B是00 42,在一个纯英文的环境里面,直接存成Unicode的文件一半都是由零组成的,浪费资源。Utf-8的主要目的是对ASCII表格头128个字母优化,牺牲的是对中文字符的存储。
头128个字节(0到127),可以用七个bit来表示,x6 x5 x4 x3 x2 x1 x0.第八个bit永远是0
例子,A, 用Hex表示是00 41,去掉开头的零字节是Hex 41,转成二进制是 0100 0001。XP带的计算器可以在Hex和Binary
之间转换,自己试试。
第128到2047个字节,要用10个bit来表示
- 0 0 0 0 0 x10 x9 x8
- 7 x6 x5 x4 x3 x2 x1 x0
Utf-8就把这些字节编成下面这样的两个byte
- 1 1 0 x10 x9 x8 x7 x6
- 1 0 x5 x4 x3 x2 x1 x0
第2048到65535个字节,要用16个bit来表示,Utf-8把这些字节编成下面这样的三个byte
- 1 1 1 0 x15 x14 x13 x12
- 1 0 x11 x10 x9 x8 x7 x6
- 1 0 x5 x4 x3 x2 x1 x0
读一个Utf-8编码的array,如果第一个byte的高位是1110,那么要连读下面两个以 10 开头的byte。如果一个byte的高位是110,那么要连读下面一个以 10 开头的byte。
如果一个byte的高位是0,那么这个byte就是一个字符了。
可以做个练习,中文字"哈"的Unicode编码是Hex 54 C8,转成Utf-8是什么?
Hex 54 C8 转成十进制是21704,转成Utf-8后要用三个byte,找张纸,画三行,每行8个格子,第一行头四个格子填上1110,第二行头两个格子填上10,第三行头两个格子填上10。剩下的自己算算。然后和这个程序的结果比较一下。
- public class Test {
- public static void main(String[] args) {
- char c[] = { '\u54c8' };
- String ha = new String(c);
- byte b[] = null;
- try {
- b = ha.getBytes("utf-8");
- } catch (Exception e) { System.exit(-1);}
- for(int i=0; i<b.length; i++) {
- System.out.print(Integer.toHexString(b[i]).substring(6) + " ");
- }
- System.out.println();
- }
- }
- Utf-8编码是如何工作的
- 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
- 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
- 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?(...
- 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
- 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
- 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的
- 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的
- 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?[转]
- 请问如何将终端的字符编码默认设置成是UTF-8的?
- mysql 数据库编码是UTF-8 如何解决乱码问题
- 如何获取一个URL传参编码是UTF-8还是GBK的取巧解决方法
- UTF-8 Unicode是如何转换的
- 如何处理提交页面是GB2312编码格式,接收页面是UTF-8格式?
- 非UTF-8编码转换为UTF-8 重点是转换的思路
- java乱码 java使用的编码是utf-8还是utf-16还是unicode
- 判断文件是否是UTF-8编码
- 检查文件是否是 UTF-8/UTF-16 编码
- C#连接MongoDB数据库应用实战
- cocos2d-x 多个child可以共一个tag
- 初学Android,图形图像之使用双缓冲画图(二十七)
- The Internet Archive
- 2012最新网站手工注入详解教程
- Utf-8编码是如何工作的
- How to schedule the thread's priority?
- 面试,面的不只是求职者
- VirtualBox安装 系统vdi压缩
- 程序员面试100题(算法)之C/C++实现字符串复制
- QTP 11 破解
- Pear 安装注意事项
- C语言病毒
- Android 如何防止代码被反编译