python 乱码转码_Python解决乱码问题
解決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解决乱码问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 足足研发了20年的小战车?
- 下一篇: 好看的按钮组件_一个能决定命运的按钮,你