<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            php語言

            談談php中的unicode和utf8編碼

            時間:2025-03-06 09:27:25 php語言 我要投稿
            • 相關推薦

            談談php中的unicode和utf8編碼

              本文給大家深入討論了unicode和utf8這兩種編碼的關系,理解好了會發現網上一些舊的東西,是嚴重多余兼過期的,因為從utf-8流行開始到現在,早已經由原來六字節可變編碼到實際完全居于unicode(UCS-2)的穩定階段。

              重新認識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);

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

            【談談php中的unicode和utf8編碼】相關文章:

            淺析PHP中的UNICODE編碼與解碼12-23

            ASCII編碼和Unicode編碼06-02

            ASCII編碼與Unicode編碼02-05

            PHP如何實現Unicode和Utf-8編碼相互轉換07-28

            C語言:ASCII編碼與Unicode編碼05-20

            php制作unicode解碼工具08-02

            php讀取和保存base64編碼圖片05-10

            PHP中php://input和$-POST的區別03-27

            PHP解密Unicode及Escape加密字符串03-23

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院