解決python亂碼問題
字串在python的內部採用unicode的編碼方式,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。 編碼是一種用二進位制資料表示抽象字元的方式,utf8是一種編碼方式。
**中的字串編碼預設和**檔案編碼相同。
decode的作用是將其他編碼的字串轉換成unicode編碼,如str1.decode('gb2312'),表示將gb2312編碼的字串str1轉換成unicode編碼。
encode的作用是將unicode編碼轉換成其他編碼的字串,如str2.encode('gb2312'),表示將unicode編碼的字串str2轉換成gb2312編碼。
因此,轉碼的時候一定要先搞明白,字串str是什麼編碼,然後decode成unicode,然後再encode成其他編碼
python2中的unicode和python3中的str等價。可以檢視s.__class__,如果為則為unicode編碼及文字資料,如果為則為utf8編碼及二進位制資料。str(s, 'utf8')和s.decode('utf8')等價。
如果字串在**中被定義為s=u'中文',則s就是python內部編碼unicode。
unicode型別再解碼會報錯。
判斷乙個字串是否為unicode方法isinstance(s, unicode),python2中的unicode和python3中的str等價,所以在python3中判斷乙個字串是否為unicode方法為isinstance(s, str)。
獲取系統預設編碼:
importsysprint(sys.getdefaultencoding())
有些ide輸出亂碼是因為控制台不能輸出字串的編碼,這倒不是程式本身的問題。比如windows的控制台是gb2312編碼方式,則utf8的輸出格式不能正確輸出。
一種輸出格式為gb2312避免亂碼的方式(如果不確定是哪種編碼格式,可以使用一下的通用形式去處理):
#coding=utf-8
s='中文'
if(isinstance(s, str)):#s為u'中文'
s.encode('gb2312')else:#s為'中文'
s.decode('utf8').encode('gb2312')
採用標準庫codecs模組
codecs.open(filename, mode='r', encoding=none, errors='strict', buffering=1)importcodecs
f= codecs.open(filename, encoding='utf-8')
使用上邊這種方式讀進來utf-8檔案,會自動轉換為unicode。但必須明確該檔案型別為utf8型別。
如果是檔案中有漢字,不是乙個位元組乙個位元組地讀而是整個漢字的所有位元組讀進來然後轉換成unicode(猜想跟漢字的utf8編碼有關)。
下邊的**也是一種使用codecs的讀寫方式
#coding=utf-8
importcodecs
fin= open("test.txt", 'r')
fout= open("utf8.txt", 'w')
reader= codecs.getreader('gbk')(fin)
writer= codecs.getwriter('gbk')(fout)
data= reader.read(10)#10是最大位元組數,預設值為-1表示盡可能大。可以避免一次處理大量資料
whiledata:
writer.write(data)
data= reader.read(10)
Python爬蟲 亂碼 轉碼
在爬取網頁時,出現中文亂碼情況,如下圖 原因 源網頁編碼和爬取下來後的編碼格式不一致 字串在python內部的表示是unicode編碼,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼 decode 成unicode,再從unicode編碼 encode 成另一種編碼 ...
python 網頁爬蟲亂碼以及轉碼問題
前言 python 3最重要的新特性大概要算是對文字和二進位制資料作了更為清晰的區分。文字總是unicode,由str型別表示,二進位制資料則由bytes型別表示。python 3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別清晰。你不能拼接字串和位元組包,也無法在位元組包裡搜...
python轉碼總結
python返回字串中有些是亂碼 如下列情況 第一種情況 此處讀取的是中文路徑下檔案,使用 print s.decode encoding gb2312 errors strict 因為字串編碼是gbk格式,也可寫成decode gbk error strict 截圖是decode方法原始碼解釋,我...