字符集編碼淺析: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 |
延伸閱讀
相關文章
- ANSI(字符集) and Unicode(字符集) and UTF-8(編碼Unicode字符集)Unicode
- 字元編碼:ASCII,Unicode和UTF-8字元ASCIIUnicode
- 字元編碼筆記:ASCII,Unicode和UTF-8字元筆記ASCIIUnicode
- 字元編碼筆記:ASCII,Unicode 和 UTF-8字元筆記ASCIIUnicode
- 字符集編碼(三):UnicodeUnicode
- 字元編碼 ASCII,Unicode 和 UTF-8 概念掃盲字元ASCIIUnicode
- 字符集編碼(上):Unicode 之前Unicode
- 帶你瞭解 Unicode和UTF-8編碼知識Unicode
- 字元編碼:Unicode & UTF-16 & UTF-8字元Unicode
- 字符集和編碼——Unicode(UTF&UCS)深度歷險Unicode
- Unicode、GBK、UTF-8、ASCII的編碼簡介UnicodeASCII
- 字元編碼發展史4 — Unicode與UTF-8字元Unicode
- Unicode中UTF-8與UTF-16編碼詳解Unicode
- 字元編解碼的故事(ASCII,ANSI,Unicode,Utf-8區別)字元ASCIIUnicode
- Python編碼和UnicodePythonUnicode
- unicode和UTF-8的區別Unicode
- unicode,utf-8Unicode
- ORACLE 修改資料庫的字符集編碼為UTF-8Oracle資料庫
- 符號編碼-ASCII、Unicode、Unicode big endian、UTF-8之間的關係(轉)符號ASCIIUnicode
- 字符集和字元編碼字元
- Oracle資料庫字符集淺析Oracle資料庫
- unicode vs utf-8Unicode
- 字符集之間轉換(UTF-8,UNICODE,Gb2312)Unicode
- 你真的瞭解 Unicode 和 UTF-8 嗎?Unicode
- Unicode 和 UTF-8 是什麼關係?Unicode
- Unicode編碼解碼Unicode
- UTF-8 and Unicode FAQ(轉)Unicode
- 深入解析字符集和字元編碼字元
- 字符集和字元編碼詳解字元
- 物料編碼與版本管理淺析(基於SAP)
- C# Unicode編碼C#Unicode
- Unicode編碼介紹Unicode
- iOS Unicode轉中文(UTF-8)iOSUnicode
- unicode、utf-8、ansi的故事Unicode
- 轉貼 (談談Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞)&(UTF-8編碼規則)Unicode
- Unicode編碼和中文互轉(JAVA實現)UnicodeJava
- Unicode和UTF-8之間的轉換詳解Unicode
- 漫畫:什麼是字符集和編碼?ASCII、UTF-8、UTF-16、UTF-32 又是什麼?ASCII