Python 的編碼問題

2021-06-21 03:10:03 字數 3248 閱讀 1959

我在爬取網頁解析的過程中出現了網頁內容解析不了的問題,雖然用記事本開啟是顯示正常的漢字和符號,但用winhex開啟就會出現亂碼的問題(把它放到cmd中也顯示亂碼),這個一般就是編碼問題,這種 編碼應該很可能是 utf-8 ,能在winhex中正常顯示漢字的應該是gb2312或者gbk編碼,所以用正規表示式匹配感覺沒問題,其實匹配不到,所以一般就需要將其轉化為gbk或者gb2312格式

那麼,怎麼才能知道檔案內容或字串是什麼編碼方式,python提供了chardet的模組,它直接可能幫我們檢測其編碼格式。

使用 chardet 可以很方便的實現字串/檔案的編碼檢測。尤其是中文網頁,有的頁面使用gbk/gb2312,有的使用utf8,如果你需要去爬一些頁面,知道網頁編碼很重要的,雖然html頁面有charset標籤,但是有些時候是不對的。那麼chardet就能幫我們大忙了。

一下就是使用方式

import urllib

rawdata = urllib.urlopen('').read()

import chardet

chardet.detect(rawdata)

所以這樣我們就知道其編碼方式是什麼了,這樣也很方便!

那麼python又應該如何轉碼呢?

這裡又提供了兩個主要的轉碼函式:

字串在python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。

decode的作用是將其他編碼的字串轉換成unicode編碼,如str1.decode('gb2312'),表示將gb2312編碼的字串str1轉換成unicode編碼。

encode的作用是將unicode編碼轉換成其他編碼的字串,如str2.encode('gb2312'),表示將unicode編碼的字串str2轉換成gb2312編碼。

因此,轉碼的時候一定要先搞明白,字串str是什麼編碼,然後decode成unicode,然後再encode成其他編碼

使用方法:s=s.decode('gb2312').encode('utf-8') 如此而已

中文的unicode形如:\u34e3 這樣,那應該如何轉化為正常的漢字呢?

>>> r=u'5f37'

>>> print r

5f37

>>> r1=unichr(int(r,16))

>>> print r1

強還有乙個unicode轉換漢字的方法:

>>> s1='\u4e2d\u56fd'

>>> str=s1.decode('unicode_escape')

>>> print str

中國*還有的情況就是文字中會有中文的符號python會檢測到不認識,如「;」所以我們需要更改系統預設編碼和將含有中文字元的文字字元轉化為gbk編碼:a.decode('utf-8').encode('gbk')假使原先為utf-8編碼,然後再進行下面轉化:以下有幾種方法:

python在安裝時,預設的編碼是ascii,當程式中出現非ascii編碼時,python的處理常常會報這樣的錯unicodedecodeerror: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128),python沒辦法處理非ascii編碼的,此時需要自己設定將python的預設編碼,一般設定為utf8的編碼格式。

查詢系統預設編碼可以在直譯器中輸入以下命令:

python**  

>>>sys.getdefaultencoding()  

設定預設編碼時使用:

python**  

>>>sys.setdefaultencoding('utf8')  

可能會報attributeerror: 'module' object has no attribute 'setdefaultencoding'的錯誤,執行reload(sys),在執行以上命令就可以順利通過。

此時在執行sys.getdefaultencoding()就會發現編碼已經被設定為utf8的了,但是在直譯器裡修改的編碼只能保證當次有效,在重啟直譯器後,會發現,編碼又被重置為預設的ascii了,那麼有沒有辦法一次性修改程式或系統的預設編碼呢。

有2種方法設定python的預設編碼:

乙個解決的方案在程式中加入以下**:

python**  

import sys  

reload(sys)  

sys.setdefaultencoding('utf8')   

另乙個方案是在python的lib\site-packages資料夾下新建乙個sitecustomize.py,內容為:

python**  

# encoding=utf8  

import sys  

reload(sys)  

sys.setdefaultencoding('utf8')   

此時重啟python直譯器,執行sys.getdefaultencoding(),發現編碼已經被設定為utf8的了,多次重啟之後,效果相同,這是因為系統在python啟動的時候,自行呼叫該檔案,設定系統的預設編碼,而不需要每次都手動的加上解決**,屬於一勞永逸的解決方法。

另外有一種解決方案是在程式中所有涉及到編碼的地方,強制編碼為utf8,即新增**encode("utf8"),這種方法並不推薦使用,因為一旦少寫乙個地方,將會導致大量的錯誤報告,我曾經遇到這種情況,錯誤日誌壓縮之後尚有70多k,全都是這乙個問題,讓人有很崩潰的感覺。

+++++++++++++++++++++++++++++++++++++++

最近又遇到的問題是讀檔案是utf-8或者ascii編碼檔案,它不能encode成gbk,但是我想判斷 『今天』  這兩個字是否在檔案字串裡,所以直接用

if "今天" in post_time: 是有問題的

想要解決這個問題的方法是:

if "今天".decode('gbk').encode('utf-8') in post_time:  通過把漢字轉換成utf-8 即可

+++++++++++++++++++++++++++++++++++++++++++

para_pattern=re.compile(r'(\d+)[\x80-\xff][\x80-\xff]',re.s)'

匹配漢字,且字串編碼為utf-8,如果匹配正常漢字有問題的就可以採用這種辦法,匹配其中的漢字可以用這種方法,乙個字是用三個位元組表示的

python的編碼問題

今天學習了python,作為乙個新手,對python的編碼問題仔細研究了一番,自己的理解如下 1 python 的檔案是以ascii編碼儲存,所以當python 檔案中有中文時 包括注釋 檔案開頭都要加 coding utf 8 或 coding gbk。2 python內部使用的都是unicode...

Python的編碼問題

python的編碼問題一般在有中文的情況下會出現。這裡的python檔案在windows環境下執行的。當python檔案不含中文時,無論.py檔案是anic ascii格式還是utf 8格式,在cmd中執行時都能得到正常的結果,但是.py檔案裡含中文時,直接編譯就會出現問題了。這裡主要有兩種情況 1...

python的編碼問題

初學者對編碼問題一定非常頭痛,我開始時也是這樣,所以下 記錄一下到目前我對python編碼問題的理解。首先,python的預設編碼是 ascii 這是表示英文和數字的常用規範編碼。也就是說這個編碼方式下只能表示英文,也就是說一旦出現中文,就會出錯,無法識別。先說一下python的檔案編碼大致處理流程...