《PHP實例:簡單談談php中的unicode和utf8編碼》要點:
本文介紹了PHP實例:簡單談談php中的unicode和utf8編碼,希望對您有用。如果有疑問,可以聯系我們。
PHP應用重新認識unicode和utf8編碼
PHP應用直到本日,準確的說是剛才,我才知道UTF-8編碼和Unicode編碼是不一樣的,是有區別的
他們之間是有一定的聯系的,看看他們的區別:
UTF-8的長度是不一定的,有可能是1、2、3字節
Unicode長度一定,2個字節(USC-2)
UTF-8可以和Unicode互相轉換
PHP應用unicode和utf8的關系
PHP應用Unicode(16進制)
PHP應用UTF-8(二進制)
PHP應用0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
PHP應用上面的表格有2個意思,第一個顯而易見便是說Unicode和UTF-8字符范圍的對應,還有一個可以看出Unicode怎么和UTF-8互相轉換:
PHP應用先說UTF-8到Unicode的轉換
PHP應用UTF-8編碼的二進制和上面的3種格式進行匹配,匹配到之后去掉固定位(表格中的非x位置),然后從右到左每8位一組,不夠8位左邊不領,湊夠2個字節16 bits,這16 bits所表示的便是UTF-8對應的Unicode編碼,看看下面幾個例子:
PHP應用
PHP應用上面圖片中的筆墨編碼格式為UTF-8,可以用WinHex看到其16進制表示
PHP應用漢 ?=> E6B189 => 11100110 10110001 10001001?=> 01101100 01001001 => 6C49
字 ?=> E5AD97 => 11100101 10101101 10010111?=> 01011011?01010111 => 5B57
PHP應用#下面是在chrome命令行下面運行的結果
'\u6C49'
"漢"
'\u5B57'
"字"
PHP應用#到這里的話,從UTF-8轉換到Unicode已經是一件非常容易的事了,看看轉換的偽代碼
讀取一個字節,11100110
判斷該UTF-8字符的格式,屬于第三種,3個字節
繼續讀取2個字節得到 11100101 10101101 10010111
依照格式去掉固定位???? 1011011 01010111
不夠16位,左邊補零??? 01011011 01010111? => 5B57
PHP應用再看看從Unicode到UTF-8的轉換
PHP應用說說問題
PHP應用再說說今天這個問題的起因,從前端輸入很多單詞,UTF-8格式每個詞最多30個字節,因此會在前端和后臺分別做驗證,javascript用的是Unicode編碼,后端程序用的是UTF-8編碼,現在的解決方法是這樣
PHP應用前端
PHP應用
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
PHP應用后臺
PHP應用
#對于GBK字符串
$len = ceil(strlen(bin2hex(iconv('GBK', 'UTF-8', $word)))/2);
#對于UTF8字符串
$len = ceil(strlen(bin2hex($word))/2);
PHP應用以上所述便是本文的全部內容了,希望大家能夠喜歡.
維易PHP培訓學院每天發布《PHP實例:簡單談談php中的unicode和utf8編碼》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。