今天寫python爬蟲,突然爬取的網頁異常,並報錯:UnicodeEncodeError: 'latin-1' codec can't encode characters in position 41-50: ordinal not in range(256);UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal,這是一個明顯的編碼格式的問題。其實不只是python2或3,還是其他java,c等程式語言,常常會遇到編碼格式的問題,異常頭痛,尤其是ASCII、gbk、utf-8等編碼之間的轉換。於是查找資料、動手實踐,找到這樣的幾個方法。
首先關於python的系統編碼格式和輸入輸出格式,我們要如何查看呢?
>>> import sys >>> sys.getdefaultencoding()# 系统默认编码格式 'UTF-8' >>> sys.stdout.encoding# 输入输出格式 'US-ASCII'
這種情況下表示,目前的命令列的輸入輸出編碼是ascii,所以需要手動改成設定環境變數LANG為utf-8:
export LANG="en_US.UTF-8"
如果是在ubuntu環境下,可以將上面這行指令加入~/.bashrc中一勞永逸解決問題,加入後執行下方指令使其生效或重新啟動生效。
source ~/.bashrc
或另一種方法是,只針對python設定對應編碼(同上,命令列運行或加入bashrc檔):
PYTHONIOENCODING='utf_8' export PYTHONIOENCODING
gbk編碼範例圖:
#ascii編碼表圖部分:
#在平時程式碼編程時別忘了給上排加上:
# -*- coding: utf-8 -*-
設定python編碼可以使用命令列,但僅在本會話中生效
>>>sys.getdefaultencoding()查看当前编码(若报错,先执行>>>import sys >>>reload(sys)); >>>sys.setdefaultencoding('utf8')设置编码
在程式碼中重新載入SYS模組並設定uft-8也是可行的,但是在pycharm中會提示錯誤
import sys reload(sys) sys.setdefaultencoding('utf8') 重启Python解释器,发现编码已被设置为utf8; 这是因为系统在Python启动的时候,自行调用该文件,设置系统的默认编码,而不需要每次都手动加上解决代码,属于一劳永逸的解决方法。
在平常開發時,我們都知道利用Decode和Encode進行轉碼作業。
Decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。 Encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
在最新的python 3版本中,字串的型別是str, 在記憶體中都是以Unicode表示,一個字元對應若干個位元組;
如果要在網路上傳輸,或儲存到磁碟上,就需要把str變成以位元組為單位的bytes。
以Unicode表示的str透過encode()方法可以編碼為指定的bytes,例如:
>>> 'ABC'.encode('ascii') b'ABC' >>> '中文'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87' >>> '中文'.encode('ascii') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
在操作字串時,我們經常遇到str和bytes的互相轉換。為了避免亂碼問題,應始終堅持使用UTF-8編碼對str和bytes進行轉換。
友誼連結【UTF-8編碼轉換工具】
編碼格式最初只有幾種,由於電腦的普及,許多國家或組織的使用,編碼格式也變得越來越多,但是國際通用的依然是UTF-8,所以應該有個良好的程式設計習慣,多使用UTF-8編碼格式。在遇到編碼問題時,也盡量保持編碼格式的統一。
以上是Python的編碼格式更改問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!