python 中文编码差异_Python 编码为什么那么蛋疼?
平常還覺得編碼問題一般能水過去,到爬蟲這真是"不信抬頭看,蒼天饒過誰"...
其實,Python2和Python3中對于編碼已經發生了很大的改變(但其實是更方便了),我們一個個來討論:
Python2
1.在Python2中默認編碼為ASCII碼
2.兩種字符序列類型:str(以默認的ASCII碼編碼,可視為數據傳輸時的bytes數據類型),Unicode類型
3.兩種類型的轉化方式為:
Python3
1.在Python3中默認編碼為Unicode
2.兩種字符類型:str(以默認的Unicode編碼),bytes數據類型
3.兩種類型的轉化方式為:
綜上,我們已經了解完了Python2和Python3之間的編碼差異
下面來介紹編碼的影響,以Python3為例(Python2中就把str當做Python3中的bytes吧)
#-*- coding:utf-8 -*-
from urllib import request
with request.urlopen('http://www.baidu.com') as url:
bytes_web_data=url.read() #使用url對象的read()方法可以讀取到網頁的源代碼
#由于無論是XML還是json,數據傳輸的類型都是以bytes數據類型進行傳輸
print('bytes數據類型下,網頁源代碼為:',bytes_web_data) #打印結果前有b''修飾,表示為bytes數據類型,不能顯示中文字符
str_web_data=bytes_web_data=bytes_web_data.decode('utf-8') #將bytes按utf-8解碼為str(Unicode編碼),能顯示中文字符
print('str數據類型下,網頁源代碼為:',str_web_data) #打印結果可顯示中文字符了
with open('baidu.html','w',encoding='utf-8') as file: #以寫的方式打開文件
file.write(str_web_data) #寫文件,使用write函數只接受str(Unicode)
上述代碼是可以順利運行的,且運行結果會生成一個baidu.html文件,點擊進入百度首頁
其實,從注釋中能提取出3個很重要的點:
1.不論是json還是XML,數據在傳輸時都是以bytes數據類型進行傳輸的。因此,從網頁上read()到的東西也是bytes數據類型的
2.寫文件只接受Unicode編碼的,在Python3中即str。若將bytes作為參數,即file.write(bytes_web_data),則會報錯:
3.windows在存儲文件時會把其保存為系統的默認編碼,由于Windows7下默認編碼為GBK,所以如果我在open('baidu.html','w')中不加上encode='utf-8'則可能會出現下列錯誤:
就是因為操作系統默認編碼的問題,會保存為GBK編碼,所以有些utf-8下的編碼無法解釋,報錯。
Ps,查找系統編碼的方式,打開cmd,在命令行模式下輸入chcp,輸出結果為 活動代碼頁:936 ,則表明為GBK編碼,剩余編碼的對應方式為:
如果你有耐心看到這里的話,差不多已經知道在url上和寫文件上的編碼的基本知識了。
總結
以上是生活随笔為你收集整理的python 中文编码差异_Python 编码为什么那么蛋疼?的全部內容,希望文章能夠幫你解決所遇到的問題。