簡單聊下Unicode和UTF-8


今晚聽同事分享提到這個,簡單總結下。

## Unicode字符集
Unicode的出現是因為ASCII等其他編碼碼不夠用了,比如ASCII是英語為母語的人發明的,只要一個字節8位就能夠表示26個英文字母了,但是當跨區域進行信息交流的時候,尤其是Internet的出現,除了“A”,“B”,“C",還有“你”,“我”,“他”需要表示,一個字節8位顯然不夠用,因此Unicode就被發明出來,Unicode的最大碼位0x10FFFF,有21位。中文對應的Unicode編碼見http://www.chi2ko.com/tool/CJK.htm

## UTF-8字符編碼
Unicode只是給這世界上每個字符規定了一個統一的二進制編號,並沒有規定程序該如何去存儲和解析。

可以說UTF-8是Unicode實現方式之一,它的規則如下:
1)對於單字節的符號,字節的第一位設為0,后面7位為這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。
2)對於n字節的符號(n>1),第一個字節的前n位都設為1,第n+1位設為0,后面字節的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個符號的unicode碼。
Unicode編碼(十六進制) UTF-8 字節流(二進制)
000000 - 00007F 0xxxxxxx
000080 - 0007FF 110xxxxx 10xxxxxx
000800 - 00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
可以看到最多一共有21個x,所以剛好能夠表示Unicode的最大的碼位。

##大端(BE)和小端(LE)
考慮4個字節的16進制表示ox12345678,計算機都是以字節為單位存儲數據的,因此內存地址空間從低到高被挖成一個個“坑”,一個蘿卜一個坑,那么相鄰的蘿卜之間自然就有順序的問題。文字說明太抽象,直接看圖理解。

 
大端跟我們平時的書寫習慣一致,比較好理解,記住大端就可以了,我們平時說的網絡字節順序也是指大端,至於小端就讓它見鬼去吧。

實在要文字說明理解的話,可以這么來:大端可以認為是“高位在尾端”(大->高),“高位”指的是我們書寫時的高位,比如1024,個十百千,1是高位,“尾端”指的是內存空間中低地址一端,所以1存儲在低地址空間,只不過計算機是以一個字節為單位的。反之小端就是“低位在尾端”(小->低)了。
 

## BOM
BOM(Byte Order Mark)是用來區分字節序列和編碼方式的(UTF-8,UTF-16,UTF-32)。就是讓編輯器或程序讀到前面幾個字節就知道后面該以哪種編碼方式來解析,8/16/32是指以多少位作為編碼單位的,依次就是1/2/4個字節,因為UTF-8是以單個字節作為編碼單位的所以其實沒有必要指定它的字節序列,所以UTF-8有BOM和無BOM的兩種。
UTF編碼 Byte Order Mark (BOM)
UTF-8 without BOM
UTF-8 with BOM EF BB BF
UTF-16LE FF FE
UTF-16BE FE FF
UTF-32LE FF FE 00 00
UTF-32BE 00 00 FE FF


## 延伸閱讀
Unicode字符平面映射:

http://zh.wikipedia.org/wiki/Unicode%E5%AD%97%E7%AC%A6%E5%B9%B3%E9%9D%A2%E6%98%A0%E5%B0%84#.E5.9F.BA.E6.9C.AC.E5.A4.9A.E6.96.87.E7.A7.8D.E5.B9.B3.E9.9D.A2


  [1]: https://images0.cnblogs.com/blog/288950/201411/192303551093399.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM