對於Python字符編碼的理解

首先請理解這句話:對於Python的內建函數encode()和decode()來講,它都是針對字符內存中(用終端所處理字符的內存表示)介於Unicode與指定編碼之間的轉換。html

示例一:python

s = '漢字'  # shell終端編碼爲UTF-8,則s是UTF-8編碼的字符
s.decode("UTF-8") # 將s經過UTF-8進行解碼,獲得u'\u6c49\u5b57'
# 而對於u'\u6c49\u5b57'的Unicode編碼內容,能夠經過如下方式再次編碼成UTF-八、GBK或者其餘編碼字符
u'\u6c49\u5b57'.encode("UTF-8") # 結果爲'\xe6\xb1\x89\xe5\xad\x97',這與repr(s)獲得的結果一致,即‘漢字’的UTF-8表示
u'\u6c49\u5b57'.encode("gbk") # 獲得結果'\xba\xba\xd7\xd6',即‘漢字’的gbk表示

知道上述基本內容,那即可以對Python處理不一樣編碼字符時的本質和現象有個直觀都印象。這個直觀印象來自於咱們直接經過終端進行文本輸入時的表現;而涉及字符編碼的另外一種操做來自於文本讀寫正則表達式

再先請參看這篇博文:Python字符編碼詳解shell

這篇博文提到了咱們讀寫文件時的兩種方式:經過內建函數open()進行讀寫;經過codecs模塊的open()函數進行讀寫。這兩種方式差異在於前者將編碼延遲到由用戶本身根據實際編碼進行處理,後者則是在open時指定編碼進行自動處理。函數

示例二:編碼

# 如下示例代碼來自上述參考博文
f = open('test.txt') # 未指定具體編碼
s = f.read() # 讀取到的具體內容與文件的實際編碼'A'相關,比如是經過'A'編碼環境的終端輸入獲得的文本
f.close()
print type(s) # <type 'str'>
# 已知是GBK編碼,解碼成unicode
u = s.decode('GBK')  # 對字符內容經過文本實際編碼(相似終端環境編碼)進行解碼,獲得Unicode編碼

示例三:spa

# 如下示例代碼來自上述參考博文
import codecs

f = codecs.open('test.txt', encoding='UTF-8') # 指定具體編碼
u = f.read() # 讀取到的內容是根據指定編碼進行解碼後的Unicode字符
f.close()
print type(u) # <type 'unicode'>

f = codecs.open('test.txt', 'a', encoding='UTF-8') # 指定具體編碼
f.write(u) # 寫入unicode,中間無需進行自動轉換

s = '漢' # GBK編碼的str
print repr(s) # '\xba\xba'
f.write(s) # 寫入GBK編碼字符,這裏會先將GBK編碼的str解碼爲unicode,再編碼爲UTF-8後進行寫入,自動完成
f.close()

這些是我的對於Python字符編碼的理解,若有不妥之處,還望指教。code


補充:htm

場景:將UTF8編碼文件讀取的「鳥巢(國家體育場)英文(Bird's Nest)」中括弧中內容提取,結果爲:鳥巢英文、國家體育場、Bird's Nest。blog

問題:利用內置函數open打開文件,for...in...遍歷讀取到文本行,正則表達式re.compile(r'[((].*?[))]')匹配時卻沒法匹配到

解決:利用codecs.open()制定編碼打開文件,正則表達式改成re.compile(ur'[((].*?[))]'),可正常匹配。


若是文章對你有用,請在收藏之餘「頂/贊」一下以示鼓勵吧 (/ω\)

相關文章
相關標籤/搜索