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 CSS 修改学习第四章 透明度设置
Feb 19 Javascript
js 实现 input type="file" 文件上传示例代码
Aug 07 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
May 29 Javascript
不到30行JS代码实现Excel表格的方法
Nov 15 Javascript
node.js中的fs.symlink方法使用说明
Dec 15 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
Jan 14 Javascript
AngularJs Modules详解及示例代码
Sep 01 Javascript
jQuery tip提示插件(实例分享)
Apr 28 jQuery
ionic实现底部分享功能
May 11 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
Apr 14 Javascript
vue中el-input绑定键盘按键(按键修饰符)
Jul 22 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
Sep 21 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将数据库中的电话号码读取出来并生成图片
2008/08/31 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
jquery中的$(document).ready()与window.onload的区别
2009/11/18 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
详解vue跨组件通信的几种方法
2017/06/15 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
零基础写python爬虫之打包生成exe文件
2014/11/06 Python
线程和进程的区别及Python代码实例
2015/02/04 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
python批量修改文件编码格式的方法
2018/05/31 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
python读写csv文件的方法
2019/08/13 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
python requests.get带header
2020/05/05 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
化工工艺设计求职信
2014/06/25 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
暑期家教宣传单
2015/07/14 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle