unicode and 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
轉載于:https://www.cnblogs.com/yelongsan/p/4115299.html
總結
以上是生活随笔為你收集整理的unicode and utf-8的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编串指令的使用
- 下一篇: 【C语言笔记初级篇】第一章:C语言快速入