Unicode 和 UTF-8 是什麼關係?
絕大多數程式設計師都聽說過 Unicode 和 UTF-8,但是清楚它們之間關係的人就不多了,關於這個問題,與其蒼白的陳述它們的概念,不如舉例子說明來得自然。
我前些天碰到一個需求:隨機生成幾個漢字。原本我便對編碼之類的問題發怵,所以完全搞不清楚狀況,無奈之下我便上網搜尋了一個 PHP 版本的實現:
<?php $zh = ''; for($i = 0; $i < 3; $i++) { $zh .= '&#'. rand(19968, 40869) . ';'; } echo mb_convert_encoding($zh, 'UTF-8', 'HTML-ENTITIES'); ?>
不過程式碼裡的「19968」和「40869」是什麼玩意?這又牽扯到 Unicode code points,為了更好的說明問題,我們需要把如上十進位制轉換成十六進位制:
shell> php -r 'echo dechex(19968);' 4e00 shell> php -r 'echo dechex(40908);' 9fcc
在 Unicode 官方網站,我們能查到 Unihan Grid Index,其中 CJK Unified Ideographs 部分包含了大部分的漢字,其 code points 恰恰是從 U+4E00 到 U+9FCC!
單單上面一個例子還不足以說明問題,下面我們挑選一個「博」字深入說明一下:
Unicode
因為我們編碼是 UTF-8,所以就先看看「博」字的 UTF-8 編碼是什麼:
<?php $string = "博"; for ($i = 0; $i < strlen($string); $i++) { echo dechex(ord($string[$i])); } ?>
程式碼看上去有點冗長,實際上利用 pack/unpack 函式可以很簡單的實現類似的邏輯:
shell> php -r 'var_dump(unpack("H6", "博"));' array(1) { ["codes"]=> string(6) "e58d9a" }
於是乎「博」字的 UTF-8 編碼是「e58d9a」,再看怎麼得到 unicode code point:
shell> php -r 'echo base_convert("e58d9a", 16, 2);' 111001011000110110011010
如上拿到了「博」字的二進位制表示,實際上其 unicode code point 就隱藏在這裡。通常漢字用 UTF-8 表示時是三個位元組,格式為「111XXXXX 10XXXXXX 10XXXXXX」,除掉標誌位,把剩餘對應位置上的資料抽取出來連線在一起,就得到了 Unicode code point,也就是「00101001101011010」,剩下的就簡單了,把它從二進位制轉換成十六進位制即可:
shell> php -r 'echo base_convert("00101001101011010", 2, 16);' 535a
需要說明的是,如果你僅僅看「博」字,會發現其 Unicode code point 和 UTF-16 是一樣的,很容易據此認為它們是等同的概念,實際上這個結論僅僅在雙位元組時成立,一旦大於兩個位元組,就不成立了,有興趣的可以參考相應的例子。
相關文章
- 什麼是Unicode,什麼是UTF-8Unicode
- GNU是什麼?和Linux是什麼關係?Linux
- GitClub和GitHub是什麼關係Github
- Java 和 JavaScript 是什麼關係?JavaScript
- openssh和openssl是什麼關係
- Chronicles 和 IRIS 是什麼關係
- IRIS 和 Caché 是什麼關係
- Flex 是什麼? flex和flash是什麼關係?flex 解決什麼問題?flex和j2ee/.net是什麼關係?Flex
- 什麼是Yottachain和YTA幣,它們是什麼關係?AI
- 元宇宙是什麼,和遊戲有什麼關係元宇宙遊戲
- 什麼是Cython?和Python有什麼關係?Python
- 奈學:Java 和 JavaScript 是什麼關係?JavaScript
- DDD和Microservices的關係是什麼?ROS
- linux和ubuntu區別是什麼?有什麼關係?LinuxUbuntu
- Linux中apt是什麼?和Dpkg有什麼關係?LinuxAPT
- 人工智慧和Python是什麼關係?人工智慧Python
- HyperLedger Fabric和區塊鏈是什麼關係?區塊鏈
- pycharm和python區別(關係)是什麼PyCharmPython
- 雲端計算和Linux是什麼關係?Linux
- Google Play 和神奇女俠是什麼關係?Go
- 面試官:什麼是 YAML?和 Spring Boot 有什麼關係?面試YAMLSpring Boot
- 微博跟微軟是什麼關係?微軟
- 什麼是反對稱關係?
- 人工智慧和區塊鏈是什麼關係?人工智慧區塊鏈
- 虛擬機器、容器和沙箱是什麼關係?虛擬機
- 平行鏈和主鏈開發是什麼關係?
- EJB和J2EE是什麼關係呀?
- BPR和ERP到底是什麼關係(轉)
- Web前端是幹什麼的?和後端是啥關係?Web前端後端
- 符號編碼-ASCII、Unicode、Unicode big endian、UTF-8之間的關係(轉)符號ASCIIUnicode
- Kubernetes和Docker之間的關係是什麼?Docker
- IP、域名和DNS的關係與區別是什麼?DNS
- k8s 和 Docker 到底是什麼關係?K8SDocker
- 大資料和人工智慧的關係是什麼?大資料人工智慧
- JDK、JRE、JVM,是什麼關係?JDKJVM
- SDK、API 和 app 之間的關係和聯絡是什麼?APIAPP
- unicode和UTF-8的區別Unicode
- 什麼是 unicode 程式碼點Unicode