亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP如何實現Unicode和Utf-8編碼相互轉換

2024-05-04 23:38:18
字體:
來源:轉載
供稿:網友

本文介紹了通過PHP實現一個函數可以對字符串進行Unicode的編碼和解碼,需要的朋友可以參考下

最近恰好要用到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: 0xxxxxxx

U-00000080 - U-000007FF: 110xxxxx 10xxxxxx

U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx

U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

xxx 的位置由字符編碼數的二進制表示的位填入, 越靠右的 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的方法進行轉換??梢詫nicode二進制從低位往高位取出二進制數字,每次取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代碼實現:

 

 
  1. /** 
  2. * utf8字符轉換成Unicode字符 
  3. * @param [type] $utf8_str Utf-8字符 
  4. * @return [type] Unicode字符 
  5. */ 
  6. function utf8_str_to_unicode($utf8_str) { 
  7. $unicode = 0; 
  8. $unicode = (ord($utf8_str[0]) & 0x1F) << 12; 
  9. $unicode |= (ord($utf8_str[1]) & 0x3F) << 6; 
  10. $unicode |= (ord($utf8_str[2]) & 0x3F); 
  11. return dechex($unicode); 
  12.  
  13. /** 
  14. * Unicode字符轉換成utf8字符 
  15. * @param [type] $unicode_str Unicode字符 
  16. * @return [type] Utf-8字符 
  17. */ 
  18. function unicode_to_utf8($unicode_str) { 
  19. $utf8_str = ''
  20. $code = intval(hexdec($unicode_str)); 
  21. //這里注意轉換出來的code一定得是整形,這樣才會正確的按位操作 
  22. $ord_1 = decbin(0xe0 | ($code >> 12)); 
  23. $ord_2 = decbin(0x80 | (($code >> 6) & 0x3f)); 
  24. $ord_3 = decbin(0x80 | ($code & 0x3f)); 
  25. $utf8_str = chr(bindec($ord_1)) . chr(bindec($ord_2)) . chr(bindec($ord_3)); 
  26. return $utf8_str; 

測試一下了

 

 
  1. $utf8_str = '我'
  2.  
  3. //這是漢字“你”的Unicode編碼 
  4. $unicode_str = '4f6b'
  5.  
  6. //輸出 6211 
  7. echo utf8_str_to_unicode($utf8_str) . "<br/>"
  8.  
  9. //輸出漢字“你” 
  10. echo unicode_str_to_utf8($unicode_str); 

以上這些轉換是針對中文漢字(非ASCII)的測試,并且只支持單個字符【一個完整的utf8字符或是一個完整的Unicode字符】互相轉換,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久成人一区二区| 亚洲高清不卡av| 日本在线观看天堂男亚洲| 丝袜美腿亚洲一区二区| 日韩激情av在线播放| 欧美日韩精品中文字幕| 欧美国产亚洲精品久久久8v| 国产精品久久久久7777婷婷| 国产剧情日韩欧美| 中文字幕日韩欧美在线| 国产成人精品在线视频| 亚洲天堂第一页| 中文字幕精品在线视频| 日韩精品极品在线观看播放免费视频| 欧美精品videosex牲欧美| 日韩精品极品毛片系列视频| 综合网日日天干夜夜久久| 日本久久久久久久久| 大伊人狠狠躁夜夜躁av一区| 日韩成人黄色av| 中文日韩在线观看| 久久久中精品2020中文| 91久久国产综合久久91精品网站| 国产一区二区三区免费视频| 亚洲欧美日韩一区二区三区在线| 国内成人精品视频| 亚洲精品美女免费| 欧美性xxxx极品高清hd直播| 国产91色在线播放| 亚洲无线码在线一区观看| 亚洲free嫩bbb| 97碰碰碰免费色视频| 国产精品美女主播| 欧美日产国产成人免费图片| 欧美精品999| 精品自拍视频在线观看| 国产精品入口免费视频一| 高清一区二区三区日本久| 国产脚交av在线一区二区| www.日韩.com| 亚洲成人精品av| 日韩精品欧美激情| 91久久久久久久久久久| 久久夜色精品亚洲噜噜国产mv| 中文.日本.精品| 久久精品精品电影网| 久久伊人精品一区二区三区| 精品国产乱码久久久久久婷婷| 久久久久亚洲精品国产| 日本欧美黄网站| 亚洲精品国产综合久久| 日韩欧美成人区| 欧美另类极品videosbest最新版本| 尤物yw午夜国产精品视频| 久久久亚洲国产天美传媒修理工| 国产精品扒开腿做爽爽爽男男| 欧美猛男性生活免费| 久久综合88中文色鬼| 欧洲成人免费视频| 国模精品系列视频| 98精品国产高清在线xxxx天堂| 精品久久久久久久久久久| 九九热99久久久国产盗摄| 2021久久精品国产99国产精品| 91av在线播放视频| 中文字幕自拍vr一区二区三区| 亚洲综合大片69999| 国外成人在线视频| 国产精品扒开腿做爽爽爽的视频| 国模私拍一区二区三区| 性欧美xxxx视频在线观看| 九色精品免费永久在线| 成人亚洲综合色就1024| 欧美黑人性视频| 美女福利精品视频| 亚洲九九九在线观看| 国产精品美女无圣光视频| 国产va免费精品高清在线| 国产精品成人在线| 日韩高清电影好看的电视剧电影| 日本一区二区不卡| 国产精品18久久久久久麻辣| 92国产精品视频| 欧美激情按摩在线| 97精品一区二区三区| 欧美在线观看网址综合| 国产精品18久久久久久麻辣| 国产视频亚洲视频| 欧美猛少妇色xxxxx| 欧美丰满少妇xxxx| 91视频国产精品| 欧美高清在线观看| 韩国精品美女www爽爽爽视频| 国产亚洲视频中文字幕视频| 欧洲成人免费视频| 色婷婷综合成人av| 国产精品久久一区| 欧美www在线| 国产中文字幕亚洲| 久久久久久97| 亚洲天堂视频在线观看| 国内精品一区二区三区四区| 久久露脸国产精品| 国产美女被下药99| 欧美日韩中文字幕综合视频| 久久久亚洲天堂| 欧美性xxxx18| 国内揄拍国内精品少妇国语| 91在线视频成人| 亚洲一区二区三区777| 欧美日韩另类在线| 91精品国产综合久久香蕉922| 伊人伊人伊人久久| 久久精品国产一区二区三区| 成人激情视频在线播放| 免费av一区二区| 欧美日韩午夜激情| 日韩av影视在线| 日韩中文字幕在线看| 成人xvideos免费视频| 亚洲最大的av网站| 91精品国产乱码久久久久久蜜臀| 国产精品一区二区三区久久| 欧美在线视频免费| 精品成人69xx.xyz| 欧美日韩国产在线播放| 国产视频在线观看一区二区| 亚洲xxxxx| 亚洲精品不卡在线| 精品国内亚洲在观看18黄| 97碰碰碰免费色视频| 欧美日韩国产成人高清视频| 国产精品wwwwww| 久久偷看各类女兵18女厕嘘嘘| 国产一区红桃视频| 26uuu国产精品视频| 中文字幕亚洲综合久久| 欧美亚洲成人xxx| 一区二区三区视频免费在线观看| 亚洲aⅴ日韩av电影在线观看| 国产精品露脸av在线| 亚洲欧洲偷拍精品| 亚洲国产日韩欧美在线图片| 久久不射电影网| 久久免费高清视频| 日韩高清电影好看的电视剧电影| 亚洲国产精品国自产拍av秋霞| 色综合视频网站| 精品久久久视频| 超薄丝袜一区二区| 国产精品女主播视频| 久久99久久久久久久噜噜| 亚洲www永久成人夜色| 精品久久久一区| 一区二区欧美激情| 97精品国产aⅴ7777| 国产一区二区三区在线观看网站| 亚洲精品在线不卡| 精品亚洲夜色av98在线观看| 911国产网站尤物在线观看| 欧美视频专区一二在线观看| 91精品国产高清久久久久久91| 88xx成人精品| 日韩中文第一页|