*做爲新手,初上手寫代碼,在開發過程當中逐漸發現對於各類編碼的屬性和意義都有了更深刻的理解,隨之也更加不清楚各類編碼之間的關係以及如何轉換。本文章經過整理總結各類編碼,幫助本身瞭解在各類環境下應該使用何種編碼,但願之後不會再迷惑。*
編碼簡介:html
1. Unicode家族 Unicode:嚴格來講,Unicode不是一種編碼方式,只能說它是一種編號與字符的映射方法,雖然用這種映射方法目前能夠將世界上全部的符號都作到一一對應,可是它並無指定每一個符號須要用多大的空間存儲。對於佔用4byte的符號,可使用4字節存儲,可是僅佔用1字節的符號根本不須要4字節空間,這樣會形成極大地浪費,可是若是你的字符長短是變化的,計算機是沒法識別的。因此UTF-X就是爲了解決這個問題而產生的的解決方案。 筆記:Unicode並非編碼方式,只有變成UTF-X以後才能算是一種編碼方式。可是UTF-X都是基於Unicode這套映射關係的。也能夠說是Unicode的實現方式。 UTF-8:這是一種可變長度的編碼方式,可使用1-4個字節表示一個符號。目前來講最經常使用,由於最省空間,機制也最先並最完善。漢字通常用3字節表示,生僻字用4-6字節表示。那麼問題來了,計算機如何區分這種長度不一樣的編碼方式呢?瞭解了編碼方式以後,我認爲它與哈夫曼樹的原理相似。 UTF-8的編碼規則很簡單,只有二條: 1)對於單字節的符號,字節的第一位設爲0,後面7位爲這個符號的 Unicode 碼。所以對於英語字母,UTF-8 編碼和 ASCII 碼是相同的。 2)對於n字節的符號(n > 1),第一個字節的前n位都設爲1,第n + 1位設爲0,後面字節的前兩位一概設爲10。剩下的沒有說起的二進制位,所有爲這個符號的 Unicode 碼。 這個機制能夠很好地讓計算機識別出這個Unicode是幾個字節。編碼規則的示意圖以下,從這裏也能夠看出UTF-8編碼方式最長也能達到六個字符:
UTF-16:一樣的道理,UTF-16是以2字節爲一個基本單位來表示字符,一樣可變長,可是基數是2字節,也就是說它理論上能夠擴展爲4字節、6字節、8字節…… UTF-32:一樣的道理,UTF-32是以4字節爲一個基本單位來表示字符,一樣可變長,可是基數是4字節。擴展規則同上。 2. ASCII 美國人搞出來的編碼 8bit編碼 規定了128個字符,第一位爲0:0xxxxxxx 數字、大小寫字母、英文標點、打印不出來的控制符 3. ISO 歐洲人搞出來的編碼,全稱爲ISO-8859-1(又名Latin1)後升級爲ISO-8859-15 8bit編碼,兼容ASCII而且充分利用了第一位bit 歐洲國家亂七八糟的語言裏面的字符都有了 4. 中文編碼家族 1. GB2312: 信息交換用漢字編碼字符集,爲了表示基數龐大的漢字的一種編碼。 2字節(16bit)表示一個漢字,理論上能表示65536個漢字 每一個漢字及符號以兩個字節來表示。第一個字節稱爲「高位字節」(也稱「區字節)」,第二個字節稱爲「低位字節」(也稱「位字節」)。每區含有94個漢字/符號。這種表示方式也稱爲區位碼。 01-09區爲特殊符號。 16-55區爲一級漢字,按拼音排序。 56-87區爲二級漢字,按部首/筆畫排序。 10-15區及88-94區則未有編碼。 「高位字節」使用了0xA1-0xF7(把01-87區的區號加上0xA0),「低位字節」使用了0xA1-0xFE(把01-94加上 0xA0)。 因爲一級漢字從16區起始,漢字區的「高位字節」的範圍是0xB0-0xF7,「低位字節」的範圍是0xA1-0xFE,佔用的碼位是 72*94=6768。其中有5個空位是D7FA-D7FE。 例如「啊」字在大多數程序中,會以兩個字節,0xB0(第一個字節) 0xA1(第二個字節)儲存。區位碼=區字節+位字節(與區位碼對比:0xB0=0xA0+16,0xA1=0xA0+1)。這裏挺有意思,第一個從1開始而不是從0開始。 2. GBK: 漢字內碼擴展規範。是在GB2312-80標準基礎上的內碼擴展規範,使用了雙字節編碼方案,其編碼範圍從8140至FEFE(剔除xx7F),共23940個碼位,共收錄了21003個漢字,徹底兼容GB2312-80標準,支持國際標準ISO/IEC10646-1和國家標準GB13000-1中的所有中日韓漢字,幷包含了BIG5編碼中的全部漢字。
經常使用場景python
python2.X:按照系統來區分編碼格式,有單獨的Unicode格式 python3.X: 統一爲Unicode格式 Windows: GB2312 GBK Linux: UTF-8 (有的時候,開發同一個項目,Windows終端和Mac終端會遇到編碼亂碼的問題,應該就是默認編碼格式的問題) 因此在使用python2.X的時候會常常遇到編碼格式的問題,由於輸入的字符串若是不指定爲Unicode,那就會使用系統的編碼格式解碼,這時會產生問題。 感謝: http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html https://www.cnblogs.com/dhsz/p/7737480.html 百度百科相關詞條