您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)php中unicode和utf8編碼的區(qū)別是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
重新認(rèn)識unicode和utf8編碼
他們之間是有一定的聯(lián)系的,看看他們的區(qū)別:
UTF-8的長度是不一定的,有可能是1、2、3字節(jié)
Unicode長度一定,2個字節(jié)(USC-2)
UTF-8可以和Unicode互相轉(zhuǎn)換
unicode和utf8的關(guān)系
Unicode(16進制)
UTF-8(二進制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
上面的表格有2個意思,第一個顯而易見就是說Unicode和UTF-8字符范圍的對應(yīng),還有一個可以看出Unicode怎么和UTF-8互相轉(zhuǎn)換:
先說UTF-8到Unicode的轉(zhuǎn)換
UTF-8編碼的二進制和上面的3種格式進行匹配,匹配到之后去掉固定位(表格中的非x位置),然后從右到左每8位一組,不夠8位左邊不領(lǐng),湊夠2個字節(jié)16 bits,這16 bits所表示的就是UTF-8對應(yīng)的Unicode編碼,看看下面幾個例子:
上面圖片中的文字編碼格式為UTF-8,可以用WinHex看到其16進制表示
復(fù)制代碼 代碼如下:
字符 => UTF-8 => UTF-8二進制=> 去掉固定位置湊夠16位的二進制 => 16進制
漢 => E6B189 => 11100110 10110001 10001001 => 01101100 01001001 => 6C49
字 => E5AD97 => 11100101 10101101 10010111 => 01011011 01010111 => 5B57
#下面是在chrome命令行下面運行的結(jié)果
'\u6C49'
"漢"
'\u5B57'
"字"
#到這里的話,從UTF-8轉(zhuǎn)換到Unicode已經(jīng)是一件非常容易的事了,看看轉(zhuǎn)換的偽代碼
讀取一個字節(jié),11100110
判斷該UTF-8字符的格式,屬于第三種,3個字節(jié)
繼續(xù)讀取2個字節(jié)得到 11100101 10101101 10010111
按照格式去掉固定位 1011011 01010111
不夠16位,左邊補零 01011011 01010111 => 5B57
再看看從Unicode到UTF-8的轉(zhuǎn)換
復(fù)制代碼 代碼如下:
5B57
獲取5B57所在的Unicode范圍,0800 <= 5B57 <= FFFF,得知5B57的UTF-8有三個字節(jié),形式為1110xxxx 10xxxxxx 10xxxxxx
獲取5B57的二進制編碼 101101101010111
用上一步驟的二進制編碼從右至左拼接UTF-8編碼 11100101 10101101 10010111
說說問題
再說說今天這個問題的起因,從前端輸入很多單詞,UTF-8格式每個詞最多30個字節(jié),因此會在前端和后臺分別做驗證,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
后臺
#對于GBK字符串 $len = ceil(strlen(bin2hex(iconv('GBK', 'UTF-8', $word)))/2); #對于UTF8字符串 $len = ceil(strlen(bin2hex($word))/2);
看完上述內(nèi)容,你們對php中unicode和utf8編碼的區(qū)別是什么有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。