最近恰好要用到unicode編碼的轉換,就去查了一下php的庫函式,居然沒找到乙個函式可以對字串進行unicode的編碼和解碼!也罷,找不到的話就自己實現一下了。。。
unicode和utf-8編碼的區別
unicode是乙個字符集,而utf-8是unicode的其中一種,unicode是定長的都為雙位元組,而utf-8是可變的,對於漢字來說unicode占有的位元組比utf-8占用的位元組少1個位元組。unicode為雙位元組,而utf-8中漢字佔三個位元組。
utf-8編碼字元理論上可以最多到6個位元組長,然而16位bmp(basic multilingual plane)字元最多只用到3位元組長。下面看一下
utf-8編碼表:
u-00000000 - u-0000007f: 0******x
u-00000080 - u-000007ff: 110***xx 10******
u-00000800 - u-0000ffff: 1110***x 10****** 10******
u-00010000 - u-001fffff: 11110*** 10****** 10****** 10******
u-00200000 - u-03ffffff: 111110xx 10****** 10****** 10****** 10******
u-04000000 - u-7fffffff: 1111110aksyguzhx 10****** 10****** 10****** 10****** 10******
*** 的位置由字元編碼數的二進位制表示的位填入, 越靠右的 x 具有越少的特殊意義,只用最短的那個足夠表達乙個字元編碼數的多位元組串。 注意在多位元組串中, 第乙個位元組的開頭"1"的數目就是整個串中位元組的數目。而第一行中以0開頭,是為了相容ascii編碼,為乙個位元組,第二行就為雙位元組字串,第三行為3位元組,如漢字就屬於這種,以此類推。(個人認為:其實我們可以簡單的把前面的1的個數看成位元組數)
unicode怎麼轉換成utf-8呢
為了要將unicode轉換為utf-8,當然要知道他們的區別到底在什麼地方。下面來看一下,在unicode中的編碼是怎樣轉換成utf-8的,在utf-8中,如果乙個字元的位元組小於0x80(128)則為ascii字元,佔乙個位元組,可以不用轉換,因為utf-8相容ascii編碼。假如在unicode中漢字「你」的編碼為「u4f60」,把它轉換為二進位制為100111101100000,然後按照utf-8的方法進行轉換。可以將unicode二進位制從低位往高位取出二進位制數字,每次取6位,如上述的二進位制就可以分別取出為如下所示的格式,前面按格式填補,不足8位用0填補。
複製** **如下:
unicode: 100111101100000 4f60
utf-8: 11100100,10111101,10100000 e4bda0
從上面就可以很直觀的看出unicode到utf-8之間的轉換,當然知道了utf-8的格式後,就可以進行逆運算,就是按照格式把它在二進位制中的相應位置上取出,然後在轉換就是所得到的unicode字元了(這個運算可以通過「位移」來完成)。如上述的「你」的轉換,由於其值大於0x800小於0x10000,因此可以判斷為三位元組儲存,則最高位需要向右移「12」位再根據三位元組格式的最高位為11100000(0xe0)求或(|)就可以得到最高位的值了。同理第二位則是右移「6」位,則還剩下最高位和第二位的二進位制值,可以通過與111111(0x3f)求按位於(&)操作,再和11000000(0x80)求或(|)。第三位就不用移位了,只要直接取最後六位(與111111(ox3f)取&),在與11000000(0x80)求或(|)。
utf-8怎麼逆轉回unicode呢
當然在utf-8到unicode的轉換也是通過移位等來完成的,就是把utf-8那些格式相應的位置的二進位制數給揪出來。在上述例子中「你」為三個位元組,因此要每個位元組進行處理,有高位到低位進行處理。在utf-8中「你」為11100100,10111101,10100000。從高位起即第乙個位元組11100100就是把其中的"0100"給取出來,這個很簡單只要和11111(0x1f)取與(&),由三位元組可以得知最到位肯定位於12位之前,因為每次取六位。所以還要將得到的結果左移12位,最高位也就這樣完成了0100,000000,000000。而第二位則是要把「111101」給取出來,則只需將第二位元組10111101和111111(0x3f)取與(&)。在將所得到的結果左移6位與最高位元組所得的結果取或(|),第二位就這樣完成了,得到的結果為0100,111101,000000。以此類推最後一位直接與111111(0x3f)取與(&),再與前面所得的結果取或(|)即可得到結果0100,111101,100000。
php**實現
/*** utf8字元轉換成unicowww.cppcns.comde字元
* @param [type] $utf8_str utf-8字元
* @return [type] unicode字元
*/function utf8_str_to_unicode($utf8_str)
/** * unicode字元轉換成utf8字元
* @param [type] $unicode_str unicode字元
* @return [type] utf-8字元
*/function unicode_to
測試一下了
$utf8_str = '我';
//這是漢字「你」的unicode編碼
$unicode_str = '4f6b';
//輸出 62程式設計客棧11
echo utf8_str_to_unicode($utf8_str) . "
";//輸出漢字「你」
echo unicode_str_to_utf8($unicode_str);
以上這些轉換是針對中文漢字【往大了說是非ascii】的測試,因為如果是ascii的話,轉來轉去都是一樣的,也用不著費那麼大工夫。
還有就是這兩個函式只是簡單的實現了一下,只支援單個字元【乙個完整的utf8字元或是乙個完整的unicode字元】互相轉換,大家如果明白了得話就可以盡情去擴充套件了。。。
本文標題: 詳談php編碼轉換問題
本文位址:
php編碼轉換及問題
首先,編碼,在大陸,最常見的也就兩種,一種是utf 8,一種是gbk gb2312。gb2312是簡體中文編碼。gbk gb2312是中文編碼,二者是相對相容的。資料庫儲存資料,一般採用utf8編碼方式。而常常我們windows系統預設的編碼方式是gb2312,這就出現了編碼不統一的問題。情景 寫入...
php 轉換中文亂碼,php中文編碼轉換問題
php中文編碼轉換的方法 1 使用iconv函式,為 string iconv string in string out string str 2 使用 mb convert encoding 函式。php中文編碼轉換的方法 一 iconvstring iconv string in charset...
PHP編碼轉換
php編碼轉換函式mb convert encoding與iconv的使用說明 文章分類 php程式設計 mb convert encodeing gbk to utf 8 例 php php header content type text html charset utf 8 echo mb c...