1. 程式人生 > >python 之路,致那些年,我們依然沒搞明白的編碼

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個作用:

  1. 直接支援全球所有語言,每個國家都可以不用再使用自己之前的舊編碼了,用unicode就可以了。(就跟英語是全球統一語言一樣)
  2. 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 ...

相關推薦

2 -12 字串編碼 python 那些我們依然明白編碼

python 之路,致那些年,我們依然沒搞明白的編碼 python編碼終極版     1 檔案與記憶體的編碼格式 搞清楚了ASCII、Unicode和UTF-8的關係,我們就可以總結一下現在計算機系統通用的字元編碼工作方式: 在計算機記憶體中,統一使用Unicode編碼,當

python 那些我們依然明白編碼

轉自:http://www.cnblogs.com/alex3714/articles/7550940.html(一個Python大牛的部落格) 本節內容   編碼回顧   編碼轉換   Python的bytes型別 編碼回顧

python——函數叠代生成器

什麽 上一個 dir 指針 tor sin import lec collect ---恢復內容開始--- 叠代器 生成器 叠代器: 1, 什麽是叠代器協議 ① dir(被測對象) 如果它含有 __iter__,那這個對象叫做可叠代對象,遵循可叠代協議。 ② 可叠代對

pythonday03--資料型別分析轉換索引切片str常用操作方法

資料型別整體分析 int :用於計算bool:True False 使用者判斷str:少量資料的儲存list:列表 儲存大量資料 上億資料[1,2,3,'zzy',[aa]]元組:只讀列表(1,23,'asdadas')dist:字典 鍵值對的形式儲存,關係型{'name':'小王八','age':16}

Python第二天基礎2-基本數據類型

cheng python ech odi lun ron zid ast aof %E5%BE%AE%E4%BF%A1%E5%85%AC%E5%85%B1%E5%8F%B7%E7%9A%84PHP%E5%BC%80%E5%8F%91%E5%9F%BA%E7%A1%80%E7

pythonpython基本語法

orm 一個 依次 條件 多語言 表示 都是 註意 方式 python基本語法: 1.python基本語句結構: 首先,在其他的語言中,比如java,c++,c#等,沒寫完一行語句之後,都需要在語句的末尾加一個分號,表示該語句結束,但是在python中,我們是不需要在每一行

pythonDay2-python模塊初認識&數據類型

存在 logs key sort 等價 不可 bsp list 變量 一、模塊初識 首先,文件名不能和導入的模塊名稱一樣。因為系統默認先從當前文件尋找模塊名,如果文件名和導入的模塊名稱一樣的話,就相當於自己調用自己,會找不到相應的方法的。 sys模塊 sys.path   

Python學習基礎篇--09Python基礎初識函數

是什麽 上一個 def 不常用 *args none 它的 動態參數 ... 函數可以分為內置函數 和 自定義函數。這次關註的主要是自定義函數。定義函數之後,就可以在任何需要它的地方調用。 1 返回值的重要性   返回值的3種情況      沒有返回值 ---- 返回Non

python——函數名的應用閉包叠代器

glob 協議 字符串 () closure nco 異常處理 類類型 單向 # ##函數名的應用# def func():# print(666)# func()## 1.函數名就是函數的內存地址# print(func) #結果<functio

第5天python

循環 reverse() 元組 [] def .so int fault rem 已經過了兩三天了,東西一點沒來寫,今天慢慢的寫吧。 還是會按Alex Li的流程來學習,編寫 寫出自己的東西 常用的數據類型     簡單的有,str ,int ,       

那些我爬過的北科(二)——爬蟲基礎session登陸

(注:由於現在域名全都要備案了,.tech 域名不讓備案,下面的nladuo.tech 統一更改為 nladuo.cn) 說說HTTP請求:GET與POST 在上一節中,我們在不知道原理的條件下呼叫了requests.get方法下載了HTML頁面。在本節中,我們來說說什麼是HTTP請求和它的特點。 在H

那些我爬過的北科(四)——爬蟲進階極簡併行爬蟲框架開發

寫在前面 在看過目錄之後,讀者可能會問為什麼這個教程沒有講一個框架,比如說scrapy或者pyspider。在這裡,我認為理解爬蟲的原理更加重要,而不是學習一個框架。爬蟲說到底就是HTTP請求,與語言無關,與框架也無關。 在本節,我們將用26行程式碼開發一個簡單的併發的(甚至分散式的)爬蟲框架。 爬蟲的

那些我爬過的北科(一)——爬蟲基礎環境搭建與入門

環境搭建 關於語言 對於網路爬蟲來說,其本質就是傳送http請求,然後提取網頁的內容資訊進行入庫分析等操作,所以對於任何語言都可以構建爬蟲應用。我曾經就用過C#、C++、Java、Swift、Golang、Python這些語言來編寫爬蟲應用。 總結來說,這裡還是最推薦python,其優點就是學習簡單,並

那些我爬過的北科(五)——資料儲存使用MongoDB

介紹 在前面我們介紹瞭如何編寫爬蟲,但是我們的爬蟲並沒有把資料儲存下來,只是簡單的顯示在控制檯中。在本節,我們將簡單學習一下資料庫,以及如何在python中操作資料庫。 最後,我們將修改上一節的爬蟲框架,使其支援資料庫插入。 注:如果讀者已經瞭解mongodb,可以直接跳到最後一個部分:修改我們的爬蟲框

那些我爬過的北科(八)——反反爬蟲驗證碼識別

寫在前面 本章將要介紹一下如何識別簡單的驗證碼。會涉及到一些影象的概念以及機器學習的知識。 我們本次識別的驗證碼來自csdn,長相如下: 在學習之前,我們先安裝本章需要的三個庫:影象庫Pillow、機器學習庫Scikit-Learn、科學計算庫Numpy。通過pip命令就可以進行安裝。

那些我爬過的北科(六)——反反爬蟲js渲染

反爬蟲和反反爬蟲? 從本章開始,我們將要進入反反爬蟲篇的內容。 感覺如果是第一聽到這個名字的讀者肯定是懵逼的狀態。現在我們先來介紹一下什麼是爬蟲、反爬蟲、反反爬蟲。 爬蟲其實就是我們前面所學的程式碼,直接使用requests.get("http://xxx.com")就能拿到網站的原始碼。 但是很多時

那些我爬過的北科(十)——搜尋案例ElasticSearch的使用

為什麼要用ElasticSearch? 一般來說資料庫都會自帶模糊搜尋的功能,但其實上真正使用的時候,遇到中文搜尋這種問題時,搜尋速度會非常慢,可能會需要O(n)或者O(logn)的複雜度。 在實際使用中,這是不允許的,因為使用者就搜尋一條語句。假設n非常大的話,等待時間可能會非常的久。所以肯定需要使用索

那些我爬過的北科(九)——搜尋案例爬蟲編寫

案例介紹 從本章開始,我們將要開始進入最後的案例實踐篇。 在爬取資料之後,我們一般會怎麼用資料呢?一般來講,我們可能會做一個搜尋引擎,比如說我們爬了新聞,可能會做一個新聞的搜尋;爬取了小說可能做一個小說的搜尋。 本案例將要爬取北科貼吧的帖子資料,並在此基礎上構建一個簡單的搜尋功能。 百度貼吧分析 這

python學習-用戶交互if,while循環

style 變量 循環 pan 說明 nbsp put 之路 字符串 一:用戶交互 與用戶交互主要使用input,這裏需要說明三點: 1:input會等待用戶輸入 2:會將輸入的內容賦值給變量 3:input出的變量都是字符串類型(str) 例子1:註意,因為input

pythonday04--列表的增刪改查巢狀、元組的巢狀、range、for迴圈巢狀

列表增刪改查 增加 append li = ['taibai','zy','nvshen'] li.append('aa') print(li) #['taibai', 'zy', 'nvshen', 'aa'] #需求:迴圈,互動,退出 # li = ['taibai','zy'