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 相关文章推荐
js自带函数备忘 数组
Dec 29 Javascript
javascript setTimeout和setInterval 的区别
Dec 08 Javascript
extjs之去除s.gif的影响
Dec 25 Javascript
javascript学习笔记(十三) js闭包介绍(转)
Jun 20 Javascript
JS 控件事件小结
Oct 31 Javascript
javascript变量作用域使用中常见错误总结
Mar 26 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
Nov 08 Javascript
Javascript中数组sort和reverse用法分析
Dec 30 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
Oct 25 Javascript
Vuejs监听vuex中值的变化的方法示例
Dec 02 Javascript
layui自定义插件citySelect实现省市区三级联动选择
Jul 26 Javascript
如何解决jQuery 和其他JS库的冲突
Jun 22 jQuery
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 list()函数的详解
2013/06/05 PHP
php桥接模式应用案例分析
2019/10/23 PHP
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
JavaScript中关联原型链属性特性
2016/02/13 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
Vue中添加过渡效果的方法
2017/03/16 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
python解析xml文件方式(解析、更新、写入)
2020/03/05 Python
python实现用户名密码校验
2020/03/18 Python
Python3 filecmp模块测试比较文件原理解析
2020/03/23 Python
python学习将数据写入文件并保存方法
2020/06/07 Python
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
英国网上超市:Ocado
2020/03/05 全球购物
同事打架检讨书
2014/02/04 职场文书
《大江保卫战》教学反思
2014/04/11 职场文书
白血病募捐倡议书
2014/05/14 职场文书
给校长的建议书100字
2014/05/16 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
产品调价通知函
2015/04/20 职场文书
围城读书笔记
2015/06/26 职场文书
Ajax实现三级联动效果
2021/10/05 Javascript
python程序的组织结构详解
2021/12/06 Python
python实现商品进销存管理系统
2022/05/30 Python