本文的測試環境:python 2.7 註:新手學習筆記 當前環境下,直接輸入中文,顯然會報錯 Non-ASCII character '\xe4' in file F:/pythons_environment_files/filecheck.py on line 3 這時候你需要在開頭加上 # _* ...
本文的測試環境:python 2.7
註:新手學習筆記
當前環境下,直接輸入中文,顯然會報錯
Non-ASCII character '\xe4' in file F:/pythons_environment_files/filecheck.py on line 3
這時候你需要在開頭加上
# _*_ coding:utf-8
然後,你就可以妥妥的各種print中文了
----------------------------
現在開始讀寫文件,我們準備了utf-8編碼的文件和gb2312編碼的文件各一份
(ps:utf-8文件的生成方式,1、txt另存為可以修改編碼方式,2、使用notepad++的同學可以直接在編碼裡面修改)
utf8url = ‘C:\Users\Administrator\Desktop\UTF-8測試.txt’
file1 = open(utf8url) #打開文件
到這裡,調試發現報錯了
IOError: [Errno 2] No such file or directory: 'C:\\Users\\Administrator\\Desktop\\UTF-8\xe6\xb5\x8b\xe8\xaf\x95.txt'
報錯提示文件找不到,但是我們的文件的確是存在的,查看錯誤信息,發現文件名的編碼不正常
處理方式:
方式1:utf8url = u ‘C:\\Users\Administrator\Desktop\\UTF-8測試.txt’
方式2: file1 = open(utrf8url.decode(‘utf-8’))
註:兩種方式從本質上是一樣的,將文件名轉成unicode字元
繼續讀取,發現一切正常
然後我們換編碼是gb2312的文本進行測試
gbkurl = u'C:\\Users\Administrator\Desktop\GBK測試.txt' #這裡我們直接使用轉換為unicode的路徑,避免出現錯誤
file2 = open(gbkurl)
print file2.read()
列印結果
GBK�����ı�
雖然沒有報錯,但是結果顯然不是我們想要的,出現了亂碼
解決方法:
對讀取的結果進行解碼操作
print file2.read().decode('gb2312')
觀察列印結果
GBK測試文本 #結果一切正常
其實,寫到這裡,對於編碼解碼我依舊是蒙的
每次都是encode不行,使用decode
utf-8不行換gb2312,總會有一種可行的
為了編碼這種情況的發生,我進行瞭如下嘗試
代碼如下:
s1 = '張三'
s2 = u‘張三’
print s1
print s1.decode('utf-8')
print s1.decode('gb2312')
print s1.encode('utf-8')
print s1.encode('gb2312')
#-------
print s2
print s2.decode('utf-8')
print s2.decode('gb2312')
print s2.encode('utf-8')
print s2.encode('gb2312')
哪些可以得到我們想要的結果呢
這些是可以輸出的
print s1
print s1.decode('utf-8')
print '----------'
print s2
print s2.encode('utf-8')
print s2.encode('gb2312')
可以看到print s2.encode('gb2312')顯示亂碼,其他都正常顯示
我們因此得出結論
1、python環境下,支持顯示字元串和unicode字元,只是非utf-8的字元串,會顯示亂碼
2、unicode字元要轉成字元串,需要進行encode編碼,具體的編碼方式,就得看你想轉成什麼編碼格式的字元串
3、字元串想轉成unicode字元,需要進行decode解碼,使用什麼解碼方式,與字元串本身的編碼方式一致
eg:utf-8的字元串想解碼,就必須使用decode('utf-8')來執行
再來思考文件中顯示的亂碼,亂碼其實就是一種不支持的編碼方式編碼的字元串
你需要解碼成unicode字元進行顯示,也可以轉成utf-8的字元串進行顯示
對s2.encode('gb2312')亂碼的修改
s2.encode('gb2312').decode('gb2312')
或者
s2.encode('gb2312').decode('gb2312').encode('utf-8')
再者,對於為什麼從txt文件讀取的字元串是gb2312的編碼
我個人的想法是讀取操作是把字元串-位元組流-字元串,本身並沒有改變編碼方式
各位看官,雖然寫的很雜亂很麻煩,但是我對encode和decode深刻理解了,你呢?