- 相關(guān)推薦
談?wù)刾hp中的unicode和utf8編碼
本文給大家深入討論了unicode和utf8這兩種編碼的關(guān)系,理解好了會(huì )發(fā)現網(wǎng)上一些舊的東西,是嚴重多余兼過(guò)期的,因為從utf-8流行開(kāi)始到現在,早已經(jīng)由原來(lái)六字節可變編碼到實(shí)際完全居于unicode(UCS-2)的穩定階段。
重新認識unicode和utf8編碼
直到今天,準確的說(shuō)是剛才,我才知道UTF-8編碼和Unicode編碼是不一樣的,是有區別的囧
他們之間是有一定的聯(lián)系的,看看他們的區別:
UTF-8的長(cháng)度是不一定的,有可能是1、2、3字節
Unicode長(cháng)度一定,2個(gè)字節(USC-2)
UTF-8可以和Unicode互相轉換
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字符范圍的對應,還有一個(gè)可以看出Unicode怎么和UTF-8互相轉換:
先說(shuō)UTF-8到Unicode的轉換
UTF-8編碼的二進(jìn)制和上面的3種格式進(jìn)行匹配,匹配到之后去掉固定位(表格中的非x位置),然后從右到左每8位一組,不夠8位左邊不領(lǐng),湊夠2個(gè)字節16 bits,這16 bits所表示的就是UTF-8對應的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命令行下面運行的結果
'\u6C49'
"漢"
'\u5B57'
"字"
#到這里的話(huà),從UTF-8轉換到Unicode已經(jīng)是一件非常容易的事了,看看轉換的偽代碼
讀取一個(gè)字節,11100110
判斷該UTF-8字符的格式,屬于第三種,3個(gè)字節
繼續讀取2個(gè)字節得到 11100101 10101101 10010111
按照格式去掉固定位 1011011 01010111
不夠16位,左邊補零 01011011 01010111 => 5B57
再看看從Unicode到UTF-8的轉換
復制代碼 代碼如下:
5B57
獲取5B57所在的Unicode范圍,0800 <= 5B57 <= FFFF,得知5B57的UTF-8有三個(gè)字節,形式為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è)字節,因此會(huì )在前端和后臺分別做驗證,javascript用的是Unicode編碼,后端程序用的是UTF-8編碼,現在的解決辦法是這樣
前端
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
后臺
?
1
2
3
4
#對于GBK字符串
$len = ceil(strlen(bin2hex(iconv('GBK', 'UTF-8', $word)))/2);
#對于UTF8字符串
$len = ceil(strlen(bin2hex($word))/2);
以上所述就是本文的全部?jì)热萘,希望大家能夠喜歡。
【談?wù)刾hp中的unicode和utf8編碼】相關(guān)文章:
淺析PHP中的UNICODE編碼與解碼12-23
ASCII編碼和Unicode編碼06-02
ASCII編碼與Unicode編碼02-05
PHP如何實(shí)現Unicode和Utf-8編碼相互轉換07-28
C語(yǔ)言:ASCII編碼與Unicode編碼05-20
php制作unicode解碼工具08-02
php讀取和保存base64編碼圖片05-10