当前位置: 首页 > 图文教程 > 网络编程 > Javascript > utf8的编码算法 转载

Javascript
JavaScript 拖拽实现(附注释),最经典简单短小精悍!
学习drag and drop js实现代码经典之作
jquery创建div 实现代码
jquery遍历input取得input的name
jQuery 对象中的类数组操作
js 发个判断字符串是否为符合标准的函数
细品javascript 寻址,闭包,对象模型和相关问题
在IE上直接编辑网页内容的js代码(IE地址栏js)
一个选择最快的服务器转向代码
JQUERY 对象与DOM对象之转换
javascript 对象比较实现代码
jquery 获取json数据实现代码
Firefox div高度自适应
xml和web特殊字符
js 表单验证方法(实用)
ie和firefox不兼容的解决方法集合
js 数组操作代码集锦
js checkbox(复选框) 使用集锦
JS 判断代码全收集
理解JavaScript的caller,callee,call,apply

Javascript 中的 utf8的编码算法 转载


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 1458 ::
收藏到网摘: n/a

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-PHPPHP-JSON
json-rpc是一种以json为数据格式的rpc协议,可以方便应用与ajax项目中,json-rpc.org是一个开源的实现。