utf8的编码算法 转载


Posted in Javascript onDecember 27, 2006

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

           【应用领域】
           虽然这种标准算法大部分已经由开发工具提供商或者库实现,但是我们依然会在某些时候需要自己实现这种算法:
           某些浏览器(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是一个开源的实现。

Javascript 相关文章推荐
javascript 兼容FF的onmouseenter和onmouseleave的代码
Jul 19 Javascript
Javascript 面向对象 继承
May 13 Javascript
js中的scroll和offset 使用比较的实例与分析
Sep 29 Javascript
jQuery中animate用法实例分析
Mar 09 Javascript
jQuery实现文本展开收缩特效
Jun 03 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
Aug 03 Javascript
javascript关于继承解析
May 10 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
Feb 08 Javascript
9102了,你还不会移动端真机调试吗
Mar 25 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
Apr 03 Javascript
vue 查看dist文件里的结构(多种方式)
Jan 17 Javascript
H5+css3+js搭建带验证码的登录页面
Oct 11 Javascript
ie和firefox中img对象区别的困惑
Dec 27 #Javascript
使用javascript访问XML数据的实例
Dec 27 #Javascript
URL编码转换,escape() encodeURI() encodeURIComponent()
Dec 27 #Javascript
escape、encodeURI、encodeURIComponent等方法的区别比较
Dec 27 #Javascript
破除网页鼠标右键被禁用的绝招大全
Dec 27 #Javascript
Windows Live的@live.com域名注册漏洞 利用代码
Dec 27 #Javascript
用javascript实现无刷新更新数据的详细步骤 asp
Dec 26 #Javascript
You might like
php框架Phpbean说明
2008/01/10 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
ThinkPHP之R方法实例详解
2014/06/20 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
PHP中常用的魔术方法
2017/04/28 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
Javascript - HTML的request类
2007/01/09 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
2019/01/08 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
vue 插槽简介及使用示例
2020/11/19 Vue.js
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
Python函数的迭代器与生成器的示例代码
2020/06/18 Python
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
linux面试题参考答案(6)
2016/06/23 面试题
常用UNIX 命令(Linux的常用命令)
2015/12/26 面试题
掌上明珠Java程序员面试总结
2016/02/23 面试题
军训生自我鉴定范文
2013/12/27 职场文书
项目副经理岗位职责
2013/12/30 职场文书
门诊手术室工作制度
2014/01/30 职场文书
校园之声广播稿
2014/01/31 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
自考生自我评价
2019/06/21 职场文书
Nginx 负载均衡是什么以及该如何配置
2021/03/31 Servers