utf8的編碼算法 轉(zhuǎn)載
utf8是我們常用的編碼方式,在web開發(fā)中使用utf8編碼能完全解決字符集問題。其實utf8是unicode字符集的一種物理實現(xiàn),它描述了如何高效的存儲unicode的內(nèi)碼(就是上面說的字符在字符集的順序碼),RFC2044文檔(http: //www.ietf.org/rfc/rfc2044.txt?number=2044)描述了如何從一個內(nèi)碼轉(zhuǎn)換成utf8格式的算法。英文不好沒關系,看這個轉(zhuǎn)換表就會馬上明白了:
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內(nèi)碼,最后一行的16進制數(shù)“7FFF FFFF”是utf8所能表示的內(nèi)碼的最大值,換成10進制是這樣的一個數(shù):2147483647(夠大吧:))[對不起,此文最初這兒寫錯了,已改正]。上面表格中右邊一列就是utf8的二進制格式,轉(zhuǎn)換規(guī)則可謂一目了然。我直接給出算法吧(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字符表示為一個大整數(shù),然后轉(zhuǎn)變成多字節(jié)編碼110110001001001:
觀察這個整數(shù)的二進制碼序列(110,110001,001001)
從后往前取
如果這個二進制序列只有后7位(小于128,也就是ascii字符)則直接取后7位二進制數(shù)形成一個utf8字符。
上面的字符“漢”二進制序列大于7位,所以取后6位(1001001),加10形成一個utf8字節(jié)(10 001001 ,16進制89)。
剩下的二進制序列(110,110001)從后向前取6位,加10形成一個utf8字節(jié)(10 110001,16進制B1)。
剩下的二進制序列(110)從后向前取6位,由于不足6位,將這個數(shù)和1110000相或,得到字符11100110,16進制E6
最后,就得到了utf8編碼,16進制表示為E6B189
【應用領域】
雖然這種標準算法大部分已經(jīng)由開發(fā)工具提供商或者庫實現(xiàn),但是我們依然會在某些時候需要自己實現(xiàn)這種算法:
某些瀏覽器(ie5)不支持encodeURI函數(shù),那么使用ajax提交漢字有兩種方案:
漢字字符經(jīng)escape轉(zhuǎn)變成形如"%uXXXX"的字符,服務端使用上述算法將u后面的unicode序號轉(zhuǎn)變成utf8字符
使用上面的算法結(jié)合escape直接在客戶端實現(xiàn)encodeURI功能(推薦使用這種方案)
實現(xiàn)json-rpc服務
json轉(zhuǎn)變。對于php來說,現(xiàn)在有兩個開源項目JSON-PHP 和 PHP-JSON。
json-rpc是一種以json為數(shù)據(jù)格式的rpc協(xié)議,可以方便應用與ajax項目中,json-rpc.org是一個開源的實現(xiàn)。
相關文章
NodeJS的url截取模塊url-extract的使用實例
本文主要介紹了NodeJS的url信息截取模塊url-extract的使用方法,最后提供了實例代碼供大家參考2013-11-11JavaScript ES6中的簡寫語法總結(jié)與使用技巧
我們在看編寫的JS ES6代碼時經(jīng)常會看到許多簡寫的語法,本篇文章就為大家一一介紹JavaScript ES6可以簡寫的語法2018-12-12一個簡單的網(wǎng)站訪問JS計數(shù)器 刷新1次加1次訪問
一個簡單的網(wǎng)站訪問JS計數(shù)器,一般就是學習下原來,不建議使用,現(xiàn)在cnzz或百度統(tǒng)計多試不錯的2012-09-09深入解析JavaScript中的立即執(zhí)行函數(shù)
立即執(zhí)行函數(shù)模式在JavaScript中可以讓你的函數(shù)在定義后立即被執(zhí)行,下面我們就來深入解析JavaScript中的立即執(zhí)行函數(shù),需要的朋友可以參考下2016-05-05JavaScript中的toLocaleLowerCase()方法使用詳解
這篇文章主要介紹了JavaScript中的toLocaleLowerCase()方法使用詳解,是JS入門學習中的基礎知識,需要的朋友可以參考下2015-06-06