詳談PHP編碼轉換問題

2022-09-27 02:30:15 字數 3010 閱讀 2696

最近恰好要用到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...