其實是對昨天爬取數據中遇到的一個小問題的總結:
在中文數據爬取時,遇到了一個小問題就是數據格式不對
\u9f3b\u7aa6\u6d46\u6db2\u56ca\u80bf這種格式的數據,這明顯是中文編碼的原因。所以對這一部分的知識做了一個小的學習總結。
一、ASCII
計算機的內部只認 二進制 0,1的狀態,通常8個二進制代表一個字節,這是計算機最小的存儲單位,一個字節可以有 2^8 = 256 個狀態。 最開始,美國制定了一套具有128個狀態的字符編碼,這被稱為ASCII碼, 這128個字符還包括了大小寫和一些鍵盤的控制符號,比如 空格 ASCII碼為32 (00100000),這套ASCII 碼基本適用了以英文為基礎的國家計算機編碼
但是中國的漢字文化博大精深,ASCII碼肯定滿足不了,有出現了適用於中文的GBK系列編碼
二、GBK系列編碼
小於127號的還是繼續使用,並且用2個大於127的字節表示一個中文字符,前面的一個字節(稱之為高字節)從0xA1用到 0xF7,后面一個字節(低字節)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。在這些編碼里,我們還把數學符號、羅馬希臘的字母、日文的假名們都編進去了,連在 ASCII 里本來就有的數字、標點、字母都統統重新編了兩個字節長的編碼,這就是常說的 全角 字符,而原來在127號以下的那些就叫 半角 字符了。 於是就把這種漢字方案叫做 “GB2312“。GB2312 是對 ASCII 的中文擴展。
三、Unicode
除了使用最多的中英文外,還有日文、韓文、泰文等等,既然語言如此多樣,而各種編碼規則又是亂成一鍋,因此為了實現統一,國際標誰化組織廢了所有的地區性編碼方案,重新搞一個包括了地球上所有文化、所有字母和符號的編碼,這個編碼成為unicode
unicode 編碼規定保留之前的ASCII 的字符,並把所有的字符都用兩個字節 去表示,這一規定雖然統一了編碼的規范,但是出現的嚴重問題是大量的浪費存儲的空間,計算機編程大部分都是英文字符,而英文字符使用一個字節就足夠表示了,unicode 編碼規定所有的字符都表示成 兩個字節,即英文字符會在另一個字節中補0,大大浪費了空間。
四、utf-8
utf-8 的編碼規則規定,像英文這樣的簡單字符用單字節表示,而像中文這樣復雜的字符用三個字節表示。
UTF-8 的編碼規則很簡單,只有二條:
1)對於單字節的符號,字節的第一位設為0,后面7位為這個符號的 Unicode 碼。因此對於英語字母,UTF-8 編碼和 ASCII 碼是相同的。
2)對於n字節的符號(n > 1),第一個字節的前n位都設為1,第n + 1位設為0,后面字節的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個符號的 Unicode 碼。
但是python對字符編碼的處理有點小復雜
utf-8和gbk編碼之間不能之間轉換,要在unicode之間過個場才能轉換
五、字符轉換
python中有兩個很好用的函數 decode() 和 encode()
decode(‘utf-8’) 是從utf-8編碼轉換成unicode編碼,當然括號里也可以寫'gbk'
encode('gbk') 是將unicode編碼編譯成gbk編碼,當然括號里也可以寫'utf-8'
Ps:json.loads()函數
json.loads()用於將str類型的數據轉成dict的同時可以進行轉碼