utf8的编码算法
上面的表格左边是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是一个开源的实现。
--EOF--若无特别说明,本站文章均为原创,转载请保留链接,谢谢
本文地址: http://www.dulao5.com/note/2006/01/16/utf8.textile