utf8的编码算法

unicode字符集是我们世界上最完善最全面的字符集,几乎包含了世界上所有的字符。其实可以这么理解,unicode字符集是一张巨大的表格,把世界上各种语言的字符和标点符号都编排到里面,然后按照一定的顺序给每个字符排号(很遗憾的是对于中文来说,这个顺序不是按照汉语拼音的顺序)。有了这张巨大的表格,世界上大部分字符就都有一个unicode内码(整数)来对应。计算机就通过记录字符的unicode码来表示这个字符,然后交给操作系统,操作系统通过unicode码到字符字体点阵的映射把这个内码转换成字体点阵显示到我们的屏幕上。
       
          utf8是我们常用的编码方式,在web开发中使用utf8编码能完全解决字符集问题。其实utf8是unicode字符集的一种物理实现,它描述了如何高效的存储unicode的内码(就是上面说的字符在字符集的顺序码),RFC2044文档(http: //www.ietf.org/rfc/rfc2044.txt?number=2044)描述了如何从一个内码转换成utf8格式的算法。英文不好没关系,看这个转换表就会马上明白了:

   UCS-4 range (hex.)           UTF-8 octet sequence (binary)
   0000 0000-0000 007F   0xxxxxxx
   0000 0080-0000 07FF   110xxxxx 10xxxxxx
   0000 0800-0000 FFFF   1110xxxx 10xxxxxx 10xxxxxx
   0001 0000-001F FFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
   0020 0000-03FF FFFF   111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
   0400 0000-7FFF FFFF   1111110x 10xxxxxx ... 10xxxxxx

         上面的表格左边是16进制表示的unicode内码,最后一行的16进制数“7FFF FFFF”是utf8所能表示的内码的最大值,换成10进制是这样的一个数:2147483647(够大吧:))[对不起,此文最初这儿写错了,已改正]。上面表格中右边一列就是utf8的二进制格式,转换规则可谓一目了然。我直接给出算法吧(js代码):


    function toUtf8(code)
    {
     var iByte=0;
     var i=0;
     result="";
     while(code>0x7f)
     {
      iByte=code%0x40;
      code=(code-iByte)/0x40;
      result="%"+(iByte|0x80).toString(16).toUpperCase()+result;
      i++;
     }
     prefix=[0x0,0xc0,0xe0,0xf0,0xf8,0xfc];
     if(i>prefix.length)
     {
      i=5;
     }
     result=""+(code|prefix[i]).toString(16).toUpperCase()+result;
     return result;
    }
        


          例如字符"汉"的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

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
UTF-8是一种可变长度的字符编码方案,用于将Unicode码点转换为字节序列。UTF-8编码使用1到4个字节表示不同范围的Unicode码点。 计算UTF-8编码的byte数组可以通过以下方法进行: 1. 首先,将Unicode码点转换为二进制表示。例如,对于码点U+4E2D,其二进制表示为0100 1110 0010。 2. 确定编码所需的字节数。根据Unicode码点的范围,使用以下规则来确定所需的字节数: - 对于Unicode码点范围U+0000至U+007F,编码为单字节。因此,该范围内的码点只需要将其二进制添加到一个字节中。例如,码点U+0041的二进制表示为0100 0001,其UTF-8编码为一个字节的0100 0001。 - 对于Unicode码点范围U+0080至U+07FF,编码为两个字节。因此,该范围内的码点需要将其二进制添加到两个字节中,并设置首字节的高两位为"110",第二个字节的高两位为"10"。例如,码点U+4E2D的二进制表示为0100 1110 0010,其UTF-8编码为两个字节的1110 0100 1011 1001。 - 对于Unicode码点范围U+0800至U+FFFF,编码为三个字节。因此,该范围内的码点需要将其二进制添加到三个字节中,并设置首字节的高三位为"1110",后两个字节的高两位为"10"。例如,码点U+1F600的二进制表示为0001 1111 0110 0000 0000,其UTF-8编码为三个字节的1111 0000 1001 1111 1000 0000。 - 对于Unicode码点范围U+10000至U+10FFFF,编码为四个字节。因此,该范围内的码点需要将其二进制添加到四个字节中,并设置首字节的高四位为"11110",后三个字节的高两位为"10"。以后的字节高两位都为"10"。例如,码点U+1F601的二进制表示为0001 1111 0110 0000 0001,其UTF-8编码为四个字节的11110 00100111 10001000 10000001。 3. 将二进制表示转换为十六进制,每个字节对应两个十六进制数字。例如,UTF-8编码1110 0100 1011 1001转换为十六进制为E4 B8 AD。 4. 将每个字节的十六进制表示添加到一起,即可得到UTF-8编码的byte数组。例如,UTF-8编码E4 B8 AD对应的byte数组为[0xE4, 0xB8, 0xAD]。 这样,就可以按照UTF-8编码规则计算出给定Unicode码点的字节数组表示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值