簡(jiǎn)單談?wù)刾hp中的unicode和utf8編碼
重新認(rèn)識(shí)unicode和utf8編碼
直到今天,準(zhǔn)確的說(shuō)是剛才,我才知道UTF-8編碼和Unicode編碼是不一樣的,是有區(qū)別的囧
他們之間是有一定的聯(lián)系的,看看他們的區(qū)別:
UTF-8的長(zhǎng)度是不一定的,有可能是1、2、3字節(jié)
Unicode長(zhǎng)度一定,2個(gè)字節(jié)(USC-2)
UTF-8可以和Unicode互相轉(zhuǎn)換
unicode和utf8的關(guān)系
Unicode(16進(jìn)制)
UTF-8(二進(jìn)制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
上面的表格有2個(gè)意思,第一個(gè)顯而易見(jiàn)就是說(shuō)Unicode和UTF-8字符范圍的對(duì)應(yīng),還有一個(gè)可以看出Unicode怎么和UTF-8互相轉(zhuǎn)換:
先說(shuō)UTF-8到Unicode的轉(zhuǎn)換
UTF-8編碼的二進(jìn)制和上面的3種格式進(jìn)行匹配,匹配到之后去掉固定位(表格中的非x位置),然后從右到左每8位一組,不夠8位左邊不領(lǐng),湊夠2個(gè)字節(jié)16 bits,這16 bits所表示的就是UTF-8對(duì)應(yīng)的Unicode編碼,看看下面幾個(gè)例子:
上面圖片中的文字編碼格式為UTF-8,可以用WinHex看到其16進(jìn)制表示
字符 => UTF-8 => UTF-8二進(jìn)制=> 去掉固定位置湊夠16位的二進(jìn)制 => 16進(jìn)制
漢 => E6B189 => 11100110 10110001 10001001 => 01101100 01001001 => 6C49
字 => E5AD97 => 11100101 10101101 10010111 => 01011011 01010111 => 5B57
#下面是在chrome命令行下面運(yùn)行的結(jié)果
'\u6C49'
"漢"
'\u5B57'
"字"
#到這里的話,從UTF-8轉(zhuǎn)換到Unicode已經(jīng)是一件非常容易的事了,看看轉(zhuǎn)換的偽代碼
讀取一個(gè)字節(jié),11100110
判斷該UTF-8字符的格式,屬于第三種,3個(gè)字節(jié)
繼續(xù)讀取2個(gè)字節(jié)得到 11100101 10101101 10010111
按照格式去掉固定位 1011011 01010111
不夠16位,左邊補(bǔ)零 01011011 01010111 => 5B57
再看看從Unicode到UTF-8的轉(zhuǎn)換
5B57
獲取5B57所在的Unicode范圍,0800 <= 5B57 <= FFFF,得知5B57的UTF-8有三個(gè)字節(jié),形式為1110xxxx 10xxxxxx 10xxxxxx
獲取5B57的二進(jìn)制編碼 101101101010111
用上一步驟的二進(jìn)制編碼從右至左拼接UTF-8編碼 11100101 10101101 10010111
說(shuō)說(shuō)問(wèn)題
再說(shuō)說(shuō)今天這個(gè)問(wèn)題的起因,從前端輸入很多單詞,UTF-8格式每個(gè)詞最多30個(gè)字節(jié),因此會(huì)在前端和后臺(tái)分別做驗(yàn)證,javascript用的是Unicode編碼,后端程序用的是UTF-8編碼,現(xiàn)在的解決辦法是這樣
前端
function utf8_bytes(str) { var len = 0, unicode; for(var i = 0; i < str.length; i++) { unicode = str.charCodeAt(i); if(unicode < 0x0080) { ++len; } else if(unicode < 0x0800) { len += 2; } else if(unicode <= 0xFFFF) { len += 3; }else { throw "characters must be USC-2!!" } } return len; } #例子 utf8_bytes('asdasdas') 8 utf8_bytes('yrt燕睿濤') 12
后臺(tái)
#對(duì)于GBK字符串 $len = ceil(strlen(bin2hex(iconv('GBK', 'UTF-8', $word)))/2); #對(duì)于UTF8字符串 $len = ceil(strlen(bin2hex($word))/2);
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
- PHP解碼unicode編碼的中文字符代碼分享
- php utf-8轉(zhuǎn)unicode的函數(shù)
- 淺析PHP中的UNICODE 編碼與解碼
- PHP中正則表達(dá)式對(duì)UNICODE字符碼的匹配方法
- PHP如何實(shí)現(xiàn)Unicode和Utf-8編碼相互轉(zhuǎn)換
- php UTF-8、Unicode和BOM問(wèn)題
- php制作unicode解碼工具(unicode編碼轉(zhuǎn)換器)代碼分享
- 用php實(shí)現(xiàn)gb2312和unicode間的編碼轉(zhuǎn)換
- PHP解密Unicode及Escape加密字符串
- php實(shí)現(xiàn)utf-8轉(zhuǎn)unicode函數(shù)分享
- PHP實(shí)現(xiàn)Unicode編碼相互轉(zhuǎn)換的方法示例
相關(guān)文章
PHP刪除特定數(shù)組內(nèi)容并且重建數(shù)組索引的方法.
我們知道.PHP沒(méi)有提供專(zhuān)門(mén)刪除一個(gè)特定數(shù)組元素的方法.但是可以通過(guò)unset()函數(shù)來(lái)完成.2011-03-03WordPress開(kāi)發(fā)中用于獲取近期文章的PHP函數(shù)使用解析
這篇文章主要介紹了WordPress開(kāi)發(fā)中用于獲取近期文章的PHP函數(shù)使用解析,即對(duì)wp_get_recent_posts函數(shù)的使用方法介紹,需要的朋友可以參考下2016-01-01總結(jié)PHP中數(shù)值計(jì)算的注意事項(xiàng)
本文將對(duì)PHP中數(shù)據(jù)計(jì)算的一些犯錯(cuò)的點(diǎn)進(jìn)行整理,并給出解決方法,其中包括四舍五入、整數(shù)和小數(shù)相乘除和浮點(diǎn)數(shù)的怪異,有需要的朋友們可以參考借鑒。2016-08-08php實(shí)現(xiàn)的驗(yàn)證碼文件類(lèi)實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的驗(yàn)證碼文件類(lèi),實(shí)例分析了php生成驗(yàn)證碼文件的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-06-06