首先要知道,字串在python內部的表示是unicode編碼(萬國碼),因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。
python編碼有兩種資料模型來支援字串型別 一種是str 一種是unicode。
s=」中文」 為str型別的字串
u=u」中文」 為unicode型別的basestring
首先str需要先decode(解碼)成為unicode,str->decode->unicode
然後將unicode通過encode(編碼)成為str,unicode->encode->str
解釋一下decode和encode:
decode:
decode的作用是將其他編碼的字串轉換成unicode編碼,如str1.decode(『gb2312』),表示將gb2312編碼的字串str1轉換成unicode編碼。
encode:
encode的作用是將unicode編碼轉換成其他編碼的字串,如str2.encode(『gb2312』),表示將unicode編碼的字串str2轉換成gb2312編碼。
因此,轉碼的時候一定要先搞明白,字串str是什麼編碼,然後decode成unicode,然後再encode成其他編碼
**中字串的預設編碼與**檔案本身的編碼一致,至於如何檢視網頁的編碼方式可以檢視部落格說明。
如:s=』中文』
如果是在utf8的檔案中,該字串就是utf8編碼,如果是在gb2312的檔案中,則其編碼為gb2312。這種情況下,要進行編碼轉換,都需要先用decode方法將其轉換成unicode編碼,再使用encode方法將其轉換成其他編碼。通常,在沒有指定特定的編碼方式時,都是使用的系統預設編碼建立的**檔案。
如果字串是這樣定義:s=u』中文』
則該字串的編碼就被指定為unicode了,即python的內部編碼,而與**檔案本身的編碼無關。因此,對於這種情況做編碼轉換,只需要直接使用encode方法將其轉換成指定編碼即可。
如果乙個字串已經是unicode了,再進行解碼則將出錯,因此通常要對其編碼方式是否為unicode進行判斷:
isinstance(s, unicode) #用來判斷是否為unicode
用非unicode編碼形式的str來encode會報錯
在python的頭部需要宣告預設的編碼方式: #-- coding:utf-8 -- (或者是#coding=utf-8) ->(文中若有用到非ascii字元時則用)
大致思路:
亂碼->unicode中轉碼->我們需要的編碼方式
decode()->unicode->encode轉化為需要的格式
舉例:
content為從檔案中讀取的gbk編碼的內容,我們通過以上方法輸出該內容。
print content.decode(『gbk』).encode(『utf-8』)
這裡的decode方法將content內容轉為unicode格式
這裡的encode方法將unicode格式的資料轉化為自己所需要的編碼方式。
另外,在爬取網頁的時候經常會遇到亂碼,但是我們可以通過檢視網頁的源**檢視charset方式,也可以通過python程式設計獲得網頁的編碼方式。
方法一:
>import urllib2
>url=""
>data=urllib2.urlopen(url).read()
>print data.decode('utf-8','ignore').encode('gbk','ignore')
方法二:
>from bs4 import beautifulsoup
>url=""
>content=urllib2.urlopen(url)
>soup=beautifulsoup(content,from_encoding="utf-8")
>print soup.encode('gbk')
這裡是使用的python的beautifulsoup模組及urllib2模組。
from_encoding=」utf-8」為該開啟的網頁的charset方式,encode(』gbk』)為你想要轉換成的編碼方式。
注意:s.decode(「utf-8」, 「ignore」) 忽略其中有異常的編碼,僅顯示有效的編碼
s.decode(「utf-8」, 「replace」) 替換其中異常的編碼,這個相對來可能一眼就知道那些字元編碼出問題了。
解決python中文亂碼問題方法總結
在執行這樣類似的 usr bin env pythons 中文 print s 最近經常遇到這樣的問題 syntaxerror non ascii character xe4 in file e coding python untitled 6.py on line 3,but no encodin...
Python中json資料亂碼問題
import codecs resp requests.get url,headers headers result json.dumps resp.json ensure ascii false 若不指定ensure ascii false,輸出的是中文的ascii 字元碼,而不是真正的中文。這是...
Python中解決中文亂碼問題
亂碼原因 因為你的檔案宣告為utf 8,並且也應該是用utf 8的編碼儲存的原始檔。但是windows的本地預設編碼是cp936,也就是gbk編碼,所以在控制台直接列印utf 8的字串當然是亂碼了。解決方法 在控制台列印的地方用乙個轉碼就ok了,列印的時候這麼寫 print myname.decod...