python 之路,致那些年,我們依然沒搞明白的編碼
轉自:http://www.cnblogs.com/alex3714/articles/7550940.html(一個Python大牛的部落格)
本節內容
編碼回顧
編碼轉換
Python的bytes型別
編碼回顧
在備編碼相關的課件時,在知乎上看到一段關於Python編碼的回答
這哥們的這段話說的太對了,搞Python不把編碼徹底搞明白,總有一天它會猝不及防坑你一把。
不過感覺這哥們的答案並沒把編碼問題寫明白,所以只好親自動筆了。
折騰編碼問題,有很多次,我以為自已明白了,最終發現,那隻不過是自圓其說而已,這一次,終於100%確定,動筆即不再改!
看這篇文章前,你應該已經知道了為什麼有編碼,以及編碼的種類情況
- ASCII 佔1個位元組,只支援英文
- GB2312 佔2個位元組,支援6700+漢字
- GBK GB2312的升級版,支援21000+漢字
- Shift-JIS 日本字元
- ks_c_5601-1987 韓國編碼
- TIS-620 泰國編碼
由於每個國家都有自己的字元,所以其對應關係也涵蓋了自己國家的字元,但是以上編碼都存在侷限性,即:僅涵蓋本國字元,無其他國家字元的對應關係。應運而生出現了萬國碼,他涵蓋了全球所有的文字和二進位制的對應關係,
- Unicode 2-4位元組 已經收錄136690個字元,並還在一直不斷擴張中...
Unicode 起到了2個作用:
- 直接支援全球所有語言,每個國家都可以不用再使用自己之前的舊編碼了,用unicode就可以了。(就跟英語是全球統一語言一樣)
- unicode包含了跟全球所有國家編碼的對映關係,為什麼呢?後面再講
Unicode解決了字元和二進位制的對應關係,但是使用unicode表示一個字元,太浪費空間。例如:利用unicode表示“Python”需要12個位元組才能表示,比原來ASCII表示增加了1倍。
由於計算機的記憶體比較大,並且字串在內容中表示時也不會特別大,所以內容可以使用unicode來處理,但是儲存和網路傳輸時一般資料都會非常多,那麼增加1倍將是無法容忍的!!!
為了解決儲存和網路傳輸的問題,出現了Unicode Transformation Format,學術名UTF,即:對unicode中的進行轉換,以便於在儲存和網路傳輸時可以節省空間!
- UTF-8: 使用1、2、3、4個位元組表示所有字元;優先使用1個字元、無法滿足則使增加一個位元組,最多4個位元組。英文佔1個位元組、歐洲語系佔2個、東亞佔3個,其它及特殊字元佔4個
- UTF-16: 使用2、4個位元組表示所有字元;優先使用2個位元組,否則使用4個位元組表示。
- UTF-32: 使用4個位元組表示所有字元;
總結:UTF 是為unicode編碼 設計 的一種 在儲存 和傳輸時節省空間的編碼方案。
字元在硬碟上的儲存
無論以什麼編碼在記憶體裡顯示字元,存到硬碟上都是2進位制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
ascii編碼(美國):
l 0b1101100
o 0b1101111
v 0b1110110
e 0b1100101
GBK編碼(中國):
老 0b11000000 0b11001111
男 0b11000100 0b11010000
孩 0b10111010 0b10100010
Shift_JIS編碼(日本):
私 0b10001110 0b10000100
は 0b10000010 0b11001101
ks_c_5601 - 1987 編碼(韓國):
나 0b10110011 0b10101010
는 0b10110100 0b11000010
TIS - 620 編碼(泰國):
ฉัน 0b10101001 0b11010001 0b10111001
...
|