网络服务器软件开发/中间件开发,关注ACE/ICE/boost

C++博客 首页 新随笔 联系 聚合 管理
  152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks

utf8的编码算法
作者:转载    转贴自:转载    点击数:827    文章录入: zhaizl




         
例如字符"汉"的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编码
2007-01-19 10:40

在网络中有很多地方都有采用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

posted on 2007-04-05 17:23 true 阅读(652) 评论(0)  编辑 收藏 引用 所属分类: 编码知识

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理