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 相关文章推荐
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 Javascript
无缝滚动js代码通俗易懂(自写)
Jun 19 Javascript
jquery实现点击消失的代码
Mar 03 Javascript
jQuery操作元素css样式的三种方法
Jun 04 Javascript
文字垂直滚动之javascript代码
Jul 29 Javascript
jQuery采用连缀写法实现的折叠菜单效果
Sep 18 Javascript
JS简单生成两个数字之间随机数的方法
Aug 03 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
Jan 13 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
Sep 12 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
Sep 13 Javascript
vue点击页面空白处实现保存功能
Nov 06 Javascript
原生js canvas实现鼠标跟随效果
Aug 02 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获取随机数字和字母的方法详解
2013/06/06 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
php无序树实现方法
2015/07/28 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
JavaScript中继承的一些示例方法与属性参考
2010/08/07 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
Javascript Ajax异步读取RSS文档具体实现
2013/12/12 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
js倒计时抢购实例
2015/12/20 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
JavaScript中Object.prototype.toString方法的原理
2016/02/24 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
原生JS发送异步数据请求
2017/06/08 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
2018/09/18 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
Python存取XML的常见方法实例分析
2017/03/21 Python
python中kmeans聚类实现代码
2018/02/23 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
pycharm安装及如何导入numpy
2020/04/03 Python
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
Android面试题及答案
2015/09/04 面试题
人力管理专业毕业生求职信
2014/02/27 职场文书
小学班级特色活动方案
2014/08/31 职场文书
个人授权委托书样本
2014/09/13 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
2016年区委书记抓基层党建工作公开承诺书
2016/03/25 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
交互式可视化js库gojs使用介绍及技巧
2022/02/18 Javascript