目前python2.0還在使用,但可以看出python3.0才是未來的主流。因此本文主要研究的是python3中的各編碼問題。
unicodeencodeerror錯誤:字元編碼錯誤
在python2中,系統預設的編碼方式是:ascii碼。字母、標點和其他字元只使用乙個位元組來表示,但對於中文字元來說,乙個位元組滿足不了需求,因此碰到中文的時候就會亂碼。
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>>
在python3中,對中文進行了全面的支援(python3 把系統預設編碼設定為 utf-8)。
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>>
所以在編寫源**檔案
***.py
時需要注意:
python3中文字字元和二進位制資料區分得更清晰,分別用 str 和 bytes 表示。文字字元全部用 str 型別表示,str 能表示 unicode 字符集中所有字元,而二進位制位元組資料用一種全新的資料型別,用 bytes 來表示。
python3 中,在字元引號前加『b』,明確表示這是乙個 bytes 型別的物件,實際上它就是一組二進位制位元組序列組成的資料,bytes 型別可以是 ascii範圍內的字元和其它十六進製制形式的字元資料,但不能用中文等非ascii字元表示。
>>> a = b'\xe7\xa6\x85'
>>> a
b'\xe7\xa6\x85'
>>> type(a)
>>> c = b'張博軒'
file "", line 1
syntaxerror: bytes can only contain ascii literal characters.
>>>
python2
python3
表現轉換
作用str
bytes
位元組encode
儲存unicode
str字元
decode
顯示str 與 bytes 之間的轉換可以用 encode 和從decode 方法。
encode 負責字元到位元組的編碼轉換。預設使用 utf-8 編碼轉換。
decode 負責位元組到字元的解碼轉換,通常使用 utf-8 編碼格式進行轉換。
如果乙個字串已經是unicode了,再進行解碼則將出錯,因此通常要對其編碼方式是否為unicode進行判斷:
isinstance(s, unicode) #用來判斷是否為unicode
用非unicode編碼形式的str來encode會報錯
chardet是python的乙個第三方庫,常用於編碼識別。
import chardet
with open('text.txt', 'rb') as f:
data = f.readline()
tmp = chardet.detect(data)
print(tmp)
""""""
utf-8是對unicode字符集進行編碼的一種編碼方式
可以在decode()中加入引數。如:
decode('gb2312', 'ignore')
意思上忽略非gb2312編碼的字元,這樣就不會報錯了。其他類似的引數如下:
Python3 0的新改動
這篇文章主要介紹了相比於python2.6,python3.0的新特性。更詳細的介紹請參見 python3.0的文件。common stumbling blocks 本段簡單的列出容易使人出錯的變動 初學者應該注意 old print the answer is 2 2 new print the ...
python 3 0 在for中使用insert
首先在python 3.0手冊中有這麼個示例 a cat window defenestrate for x in a make a slice copy of the entire list if len x 6 a.insert 0,x a defenestrate cat window def...
Python 3 0最簡單的爬蟲
做個小專案練練手,比較有動力繼續下去,這邊參考最簡單的爬蟲程式自己抄了一下。但是因為3.0的關係,無法直接使用,根據2.0版本的 進行修改後成功了。如下 coding utf 8 import urllib.request import re 該函式用於獲取html內容 使用到urlopen的函式 ...