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的变量作用域深入理解
Oct 25 Javascript
Tinymce+jQuery.Validation使用产生的BUG
Mar 29 Javascript
javascript学习笔记(三)BOM和DOM详解
Sep 30 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
Aug 30 Javascript
AngularJS Ajax详解及示例代码
Aug 17 Javascript
基于JavaScript实现添加到购物车效果附源码下载
Aug 22 Javascript
巧用weui.topTips验证数据的实例
Apr 17 Javascript
vue安装和使用scss及sass与scss的区别详解
Oct 15 Javascript
Vue混入mixins滚动触底的方法
Nov 22 Javascript
微信小程序自定义顶部组件customHeader的示例代码
Jun 03 Javascript
实例讲解React 组件生命周期
Jul 08 Javascript
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
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语法速查表
2007/01/02 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
2016/04/14 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
php根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
JS实现小米轮播图
2020/09/21 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
Python中的tuple元组详细介绍
2015/02/02 Python
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
python实现决策树分类算法
2017/12/21 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
Python读写操作csv和excle文件代码实例
2020/03/16 Python
Python 串口通信的实现
2020/09/29 Python
python 实现"神经衰弱"翻牌游戏
2020/11/09 Python
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
Android笔试题总结
2014/11/29 面试题
给朋友的道歉信
2014/01/09 职场文书
《影子》教学反思
2014/02/21 职场文书
三字经教学反思
2014/04/26 职场文书
我的理想演讲稿
2014/04/30 职场文书
公司搬迁通知
2015/04/20 职场文书