填一填python2.x 中文字符編碼的坑

背景

python做爲最優雅的語言之一一直倍受你們的青睞。它能夠幫你從單調重複的工做解脫出來,好比統計各類蛋疼的數據,導入導出boss須要的表格等等。你要作的是編寫、運行python腳本,而後喝個茶水等着運行結果就行了。html

這篇文章就是這樣產生的----在我使用scrapy爬取數據的時候,遇到了python 2.x 中文字符編碼的問題,之前對這個問題也是隻知其一;不知其二,此次再次遇到說明要還債了,去搞清楚字符編碼究竟是怎麼一回事。python

預備知識

ASCII

首先,咱們須要明確在計算機中全部信息最終都是使用二進制表示的,每一個二進制位(bit)有0和1兩種狀態,8個二進制位被稱爲一個字節(byte),能夠表示256種狀態。數據庫

做爲計算機領域的先驅,美國在上世紀60年代制定了一套字符編碼,使用二進制來表示英文字母、數字及一些符號,這套字符編碼就是ASCIIjson

Unicode

隨着計算機的發展,很快有了其餘語言的編碼需求,單字節的ASCII編碼因爲能表示的字符有限,已經不能知足需求了。爲了避免與ASCII編碼衝突,有能力的國家開始設計單獨的編碼----使用更多的字節表示字符,中國製定了gb2312數組

可是,隨之而來的是字符編碼方案數量增長帶來的一系列問題。所以,Unicode應運而生。它把全部語言的字符都用同一種字符集來表示,解決了因不一樣字符編碼方案帶來的一系列問題bash

而後來講說Python 2.x 中文編碼問題

先給你們來一個簡單的🌰,比較常見scrapy

文件test.py內容:ui

#!/usr/bin/python
city = '京'
print city
複製代碼

運行python test.py,結果如圖:編碼

那爲何那? 若是你不知道,說明你沒有仔細看預備知識。這是由於.py文件默認採用的是ASCII編碼,中文字符不在它表示的範圍內,報錯

經過修改test.py默認編碼方式解決spa

#!/usr/bin/python
# -*- coding: utf-8 -*-
city = '京'
print city
複製代碼

看過了🌰,再來看看str和unicode

str和unicode都是basestring的子類。可是,嚴格來講unicode是真正意義上的字符串,str是字節碼----由unicode通過編碼後的字節組成的序列。 上個截圖,消除你們的疑惑,s == s2

經過這個🌰,理解str和unicode的區別,媽媽不再擔憂處理中文字符時出現亂碼或報錯了(不管是unicode轉str,仍是str轉unicode),還要避免以下操做

  • 1.對中文的unicode進行decode,非法
  • 2.對中文的str進行encode,非法

說了這麼多,show me you code (斜眼笑)🌰:

#!/usr/bin/python
# -*- coding: utf-8 -*-
u_z = u'京'
s_z = '京'
u=u'jing'
s='jing'

print u_z
print s_z
print repr(u_z)
print repr(s_z)

print '=================='

print u
print s
print repr(u)
print repr(s)

print '=================='

print u.decode()
print s.encode()

print u_z.decode()
print s_z.encode()
複製代碼

一點建議

  • 同一工程下,統一源文件字符編碼、統一系統字符編碼,防止亂碼
    #!/usr/bin/python
    # -*- coding:utf8 -*-
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    複製代碼
  • 儘可能使用unicode
  • 數組,字典存入數據庫前,進行json.dumps
  • decode和encode格式統一

好了,這就是我對python2.x 中文字符編碼的一些理解,但願能夠幫到你

未經本人容許,不得轉載。文章有疏漏淺薄之處,請各位大神斧正

相關文章
相關標籤/搜索