加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

utf8编码算法是什么样的 如何做到

发布时间:2023-06-20 12:38:30 所属栏目:语言 来源:
导读: 这篇文章给大家分享的是utf8编码算法是什么样的,如何实现?。小编觉得挺实用的,因此分享给大家做个参考,文中的介绍得很详细,而要易于理解和学习,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。

    这篇文章给大家分享的是utf8编码算法是什么样的,如何实现?。小编觉得挺实用的,因此分享给大家做个参考,文中的介绍得很详细,而要易于理解和学习,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。

    unicode字符集可以理解成是一张巨大的表格,把世界上各种语言的字符和标点符号都编排到里面,然后按照一定的顺序给每个字符排号(很遗憾的是对于中文来说,这个顺序不是按照汉语拼音的顺序)。有了这张巨大的表格,世界上大部分字符就都有一个unicode内码(整数)来对应。计算机就通过记录字符的unicode码来表示这个字符,然后交给操作系统,操作系统通过unicode码到字符字体点阵的映射把这个内码转换成字体点阵显示到我们的屏幕上。

    utf8是我们常用的编码方式,在web开发中使用utf8编码能完全解决字符集问题。其实utf8是unicode字符集的一种物理实现,它描述了如何高效的存储unicode的内码(就是上面说的字符在字符集的顺序码),RFC2044文档描述了如何从一个内码转换成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

      【应用领域】

      虽然这种标准算法大部分已经由开发工具提供商或者库实现,但是我们依然会在某些时候需要自己实现这种算法:

      某些浏览器(ie5)不支持encodeURI函数,那么使用ajax提交汉字有两种方案:

      汉字字符经escape转变成形如"%uXXXX"的字符,服务端使用上述算法将u后面的unicode序号转变成utf8字符

     使用上面的算法结合escape直接在客户端实现encodeURI功能(推荐使用这种方案)

     实现json-rpc服务

     json是javascript的对象直接量形式,其中字符串必须是unicode字符,汉字需要转换成"\uXXXX"的形式。所以我们需要把服务端字符进行json转变。对于php来说,现在有两个开源项目JSON-PHP 和 PHP-JSON。

     json-rpc是一种以json为数据格式的rpc协议,可以方便应用与ajax项目中,json-rpc.org是一个开源的实现。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!