utf8的编码算法
来源:互联网 发布:阿里云短信发送 编辑:程序博客网 时间:2024/05/17 07:19
例如字符"汉"的unicode是6C49,把这个unicode字符表示为一个大整数,然后转变成多字节编码110110001001001:
观察这个整数的二进制码序列(110,110001,001001)
从后往前取
如果这个二进制序列只有后7位(小于128,也就是ascii字符)则直接取后7位二进制数形成一个utf8字符。
上面的字符“汉”二进制序列大于7位,所以取后6位(1001001),加10形成一个utf8字节(10 001001 ,16进制89)。
剩下的二进制序列(110,110001)从后向前取6位,加10形成一个utf8字节(10 110001,16进制B1)。
剩下的二进制序列(110)从后向前取6位,由于不足6位,将这个数和1110000相或,得到字符11100110,16进制E6
最后,就得到了utf8编码,16进制表示为E6B189
在网络中有很多地方都有采用UTF8编码,由于要编写与邮件服务端有关的程序,而邮件服务端有些地方用到了UTF8编码,所以对它有了初步的认识!
它其实和Unicode是同类,就是在编码方式上不同!
首先UTF8编码后的大小是不一定,不像Unicode编码后的大小是一样的!
我们先来看Unicode的编码:一个英文字母 “a” 和 一个汉字 “好”,编码后都是占用的空间大小是一样的,都是两个字节!
而UTF8编码:一个英文字母“a” 和 一个汉字 “好”,编码后占用的空间大小就不样了,前者是一个字节,后者是三个字节!
现在就让我们来看看UTF8编码的原理吧:
因为一个字母还有一些键盘上的符号加起来只用二进制七位就可以表示出来,而一个字节就是八位,所以UTF8就用一个字节来表式字母和一些键盘上的符号。然而当我们拿到被编码后的一个字节后怎么知道它的组成?它有可能是英文字母的一个字节,也有可能是汉字的三个字节中的一个字节!所以,UTF8是有标志位的!
当要表示的内容是 7位 的时候就用一个字节:0******* 第一个0为标志位,剩下的空间正好可以表示ASCII 0-127 的内容。
当要表示的内容在 8 到 11 位的时候就用两个字节:110***** 10****** 第一个字节的110和第二个字节的10为标志位。
当要表示的内容在 12 到 16 位的时候就用三个字节:1110***** 10****** 10****** 和上面一样,第一个字节的1110和第二、三个字节的10都是标志位,剩下的空间正好可以表示汉字。
以此类推:
四个字节:11110**** 10****** 10****** 10******
五个字节:111110*** 10****** 10****** 10****** 10******
六个字节:1111110** 10****** 10****** 10****** 10****** 10******
.............................................
..............................................
明白了没有?
编码的方法是从低位到高位
现在就让我们来看看实例吧!
红色为标志位
其它着色为了显示其,编码后的位置
Unicode十六进制
Unicode二进制
UTF8二进制
UTF8十六进制
UTF8字节数
B
00001011
00001010
B
1
9D
00010011101
11000010 10011101
C2 9D
2
A89E
10101000 10011110
11101010 10100010 10011110
EA A2 9E
3
- utf8的编码算法
- utf8的编码算法
- 判断是否utf8编码的算法
- utf8的编码原理
- UTF8的编码解码
- ASP中UTF8编码函数及UTF8编码算法讲解
- Delphi utf8编码的解码
- UTF8,UTF16的编码说明
- uncode,utf8编码的文章
- 简单的UTF8编码生成
- Windows下的UTF8编码
- [编码] 无BOM的UTF8
- mysql编码utf8的设置
- mysql的utf8编码配置
- GB编码与UTF8编码的转换
- 其它编码的字符转utf8编码
- UTF8编码字符串转换成Unicode编码字符串算法
- UTF8编码
- 运用RUP 4+1视图方法进行软件架构设计
- 为自己的梦想清醒而有计划地活着
- linux 下c 编译和调试
- android testing (一)
- 计算机网络知识应用层知识总结
- utf8的编码算法
- android testing (二)
- android testing (三)————关于Android test 中涉及多个Activity的问题
- 跟我学习改造OracleXE为具有真正意义开发使用的数据库
- Vector的注意事项(大小与容量)
- js,apply()方法创建数组
- [全程建模]UML到底该怎么用
- dom4j 解析 XML
- C++的四个类型转换