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中的事件代理初探
Mar 08 Javascript
angularjs中的单元测试实例
Dec 06 Javascript
jQuery消息提示框插件Tipso
May 04 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
Mar 04 Javascript
JavaScript中日常收集常见的10种错误(推荐)
Jan 08 Javascript
Vue 2.X的状态管理vuex记录详解
Mar 23 Javascript
浅谈在react中如何实现扫码枪输入
Jul 04 Javascript
详解Vue CLI3 多页应用实践和源码设计
Aug 30 Javascript
小程序云开发获取不到数据库记录的解决方法
May 18 Javascript
jquery实现购物车基本功能
Oct 25 jQuery
Jquery属性的获取/设置及样式添加/删除操作技巧分析
Dec 23 jQuery
Vue v-for中的 input 或 select的值发生改变时触发事件操作
Aug 31 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
Terran历史背景
2020/03/14 星际争霸
php5.5中类级别的常量使用介绍
2013/10/02 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
2019/04/05 PHP
javascript jQuery $.post $.ajax用法
2008/07/09 Javascript
JavaScript 动态改变图片大小
2009/06/11 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
jquery+ajax请求且带返回值的代码
2015/08/12 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
vue学习笔记之指令v-text && v-html && v-bind详解
2017/05/12 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
跟老齐学Python之??碌某?? target=
2014/09/12 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
2020/04/22 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
Python如何将模块打包并发布
2020/08/30 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
森林防火标语
2014/06/23 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
如何获取numpy array前N个最大值
2021/05/14 Python