簡單談談php中的unicode和utf8編碼_PHP教程

來源:互聯網
上載者:User

簡單談談php中的unicode和utf8編碼


重新認識unicode和utf8編碼

直到今天,準確的說是剛才,我才知道UTF-8編碼和Unicode編碼是不一樣的,是有區別的囧
他們之間是有一定的聯絡的,看看他們的區別:
UTF-8的長度是不一定的,有可能是1、2、3位元組
Unicode長度一定,2個位元組(USC-2)
UTF-8可以和Unicode互相轉換

unicode和utf8的關係

Unicode(16進位)

UTF-8(二進位)

0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

上面的表格有2個意思,第一個顯而易見就是說Unicode和UTF-8字元範圍的對應,還有一個可以看出Unicode怎麼和UTF-8互相轉換:

先說UTF-8到Unicode的轉換

UTF-8編碼的二進位和上面的3種格式進行匹配,匹配到之後去掉固定位(表格中的非x位置),然後從右至左每8位一組,不夠8位左邊不領,湊夠2個位元組16 bits,這16 bits所表示的就是UTF-8對應的Unicode編碼,看看下面幾個例子:

上面圖片中的文字編碼格式為UTF-8,可以用WinHex看到其16進位表示

代碼如下:


字元 => UTF-8 => UTF-8二進位=> 去掉固定位置湊夠16位的二進位 => 16進位

漢 => E6B189 => 11100110 10110001 10001001 => 01101100 01001001 => 6C49
字 => E5AD97 => 11100101 10101101 10010111 => 01011011 01010111 => 5B57

#下面是在chrome命令列下面啟動並執行結果
'\u6C49'
"漢"
'\u5B57'
"字"

#到這裡的話,從UTF-8轉換到Unicode已經是一件非常容易的事了,看看轉換的虛擬碼
讀取一個位元組,11100110
判斷該UTF-8字元的格式,屬於第三種,3個位元組
繼續讀取2個位元組得到 11100101 10101101 10010111
按照格式去掉固定位 1011011 01010111
不夠16位,左邊補零 01011011 01010111 => 5B57

再看看從Unicode到UTF-8的轉換

複製代碼 代碼如下:


5B57
擷取5B57所在的Unicode範圍,0800 <= 5B57 <= FFFF,得知5B57的UTF-8有三個位元組,形式為1110xxxx 10xxxxxx 10xxxxxx
擷取5B57的二進位編碼 101101101010111
用上一步驟的二進位編碼從右至左拼接UTF-8編碼 11100101 10101101 10010111

說說問題

再說說今天這個問題的起因,從前端輸入很多單詞,UTF-8格式每個詞最多30個位元組,因此會在前端和後台分別做驗證,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);

以上所述就是本文的全部內容了,希望大家能夠喜歡。

http://www.bkjia.com/PHPjc/1014274.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1014274.htmlTechArticle簡單談談php中的unicode和utf8編碼 重新認識unicode和utf8編碼 直到今天,準確的說是剛才,我才知道UTF-8編碼和Unicode編碼是不一樣的,是有區別...

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.