utf8的编码算法
来源:互联网 发布:cf手机版刷枪软件 编辑:程序博客网 时间:2024/05/16 14:40
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
- utf8的编码算法
- utf8的编码算法
- 判断是否utf8编码的算法
- utf8的编码原理
- UTF8的编码解码
- ASP中UTF8编码函数及UTF8编码算法讲解
- Delphi utf8编码的解码
- UTF8,UTF16的编码说明
- uncode,utf8编码的文章
- 简单的UTF8编码生成
- Windows下的UTF8编码
- [编码] 无BOM的UTF8
- mysql编码utf8的设置
- mysql的utf8编码配置
- GB编码与UTF8编码的转换
- 其它编码的字符转utf8编码
- UTF8编码字符串转换成Unicode编码字符串算法
- UTF8编码
- NAT FAQS
- window.onload()的问题
- Reduced ID Numbers pku2769
- 《长尾》完整汉化版
- 删除指定进程
- utf8的编码算法
- 在Mobile上用C#完成back键“Press&Hold”的响应
- 如何设置用ASP.NET上传大文件问题
- 想精通咖啡的不要错过了---麦咖啡规则的通配符
- 几个比较好的技术网站
- IE浏览器的菜单栏和工具栏原理
- HTML结构化:实践DIV+CSS网页布局入门指南
- 抓屏
- action english2005_223