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 相关文章推荐
Auntion-TableSort国人写的一个javascript表格排序的东西
Nov 12 Javascript
JavaScript 异步调用框架 (Part 3 - 代码实现)
Aug 04 Javascript
jQuery html()等方法介绍
Nov 18 Javascript
用JS实现一个TreeMenu效果分享
Aug 28 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
Aug 01 Javascript
Bootstrap表格使用方法详解
Feb 17 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
Apr 26 Javascript
Vue验证码60秒倒计时功能简单实例代码
Jun 22 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
Sep 06 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
Oct 02 Javascript
vue动画效果实现方法示例
Mar 18 Javascript
JS常用排序方法实例代码解析
Mar 03 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
天津市收音机工业发展史
2021/03/04 无线电
十天学会php(1)
2006/10/09 PHP
php使用递归函数实现数字累加的方法
2015/03/16 PHP
PHP查询分页的实现代码
2017/06/09 PHP
PHP基于IMAP收取邮件的方法示例
2017/08/07 PHP
jquery鼠标停止移动事件
2013/12/21 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
jquery实现文本框数量加减功能的例子分享
2014/05/10 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
jQuery回调函数的定义及用法实例
2014/12/23 Javascript
jQuery()方法的第二个参数详解
2015/04/29 Javascript
jquery实现模拟百分比进度条渐变效果代码
2015/10/29 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
node.js学习之断言assert的使用示例
2017/09/28 Javascript
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
Python数据分析之如何利用pandas查询数据示例代码
2017/09/01 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
tensorflow如何批量读取图片
2019/08/29 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
什么是python的函数体
2020/06/19 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
巴西儿童时尚购物网站:Dinda
2019/08/14 全球购物
社区十八大感言
2014/01/19 职场文书
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
教师工作表现自我评价
2015/03/05 职场文书
家访教师心得体会
2016/01/23 职场文书
TS 类型兼容教程示例详解
2022/09/23 Javascript