Python2的編碼問題

Python2的編碼問題

Unicode

Unicode 的學名是”Universal Multiple-Octet Coded Character Set”,簡稱爲UCS。它爲世界上每一種語言的每一個字符定義了一個唯一的字符碼,Unicode 標準使用十六進制數字表示,數字前面加上前綴 U+,比如字母『A』的Unicode編碼是 U+0041,漢字『中』的Unicode 編碼是U+4E2D

其他編碼與Unicode的關係

avatar
unicode是統一的表達方式,其他編碼是對Unicode的具體實現。例如在linux機器中常用的編碼方式爲utf8,而在windows機器中常用的編碼方式爲gbk。所以在windows上處理的文件,換到mac下就會出現亂碼等問題。當然在mac下的文件,換到windows中也是可能出現亂碼問題的。

python2

在python2中直接出現漢字,是會報錯的,ascii不能正確的解析某個位置的數據。例如在test.py中包含有以下代碼

a = '你是誰'

然後在命令行中執行python test.py就會報如下錯誤

  File "test.py", line 1
SyntaxError: Non-ASCII character '\xe4' in file test.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

在文件的開頭加上 # encoding=utf8或者# -*- coding: utf-8 -*-之後,就不會出現這種問題。

str和unicode的轉化

>>> a = '你是誰'
>>> a
'\xe4\xbd\xa0\xe6\x98\xaf\xe8\xb0\x81'
>>> b = u'你是誰'
>>> b
u'\u4f60\u662f\u8c01'
>>> a == b
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False
>>> a.decode('utf8')
u'\u4f60\u662f\u8c01'
>>> a.decode("utf8") == b
True

實例解析

在mac環境下,用gbk編碼寫入字符到文件,然後讀取解析

>>> a = '你是誰'
>>> with open('test.txt', 'w') as file:
...     file.write(a.decode('utf8').encode('gbk'))
...
>>> with open('test.txt', 'r') as file:
...     content = file.read()
...
>>> print content
����˭

第一步完成之後,然後打印直接讀取的數據,發現是亂碼。原因是’你是誰’在存儲的時候是gbk編碼的。那麼在讀取的時候,數據也是gbk編碼的,在utf8環境中,uft8對這個字符串解析就是亂碼了,此字符串是gbk編碼的,相當於用utf8這把鑰匙在嘗試打開gbk編碼的大門,顯然是不行的。
這個時候就需要首先用正確編碼方式進行解碼爲Unicode了

>>> content.decode('gbk')
u'\u4f60\u662f\u8c01'

在轉化成了Unicode之後,就可以轉化成任何字符編碼的字符串了

>>> content.decode('gbk').encode('utf8') == '你是誰'
True

做一個知識型討飯的,有些閒錢的,覺得對你有用的可以捐點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章