真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python2和Python3中默認(rèn)編碼的差異-創(chuàng)新互聯(lián)

最近在使用 Python3.4 做一些腳本實(shí)現(xiàn),發(fā)現(xiàn)對(duì)于編碼的處理上和 Python2.6 有很大的不同,就此機(jī)會(huì)把相關(guān)知識(shí)做個(gè)梳理,方便需要的時(shí)候查閱。

成都創(chuàng)新互聯(lián)始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過(guò)多達(dá)十多年累計(jì)超上千家客戶(hù)的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶(hù),其中包括:履帶攪拌車(chē)等企業(yè),備受客戶(hù)稱(chēng)揚(yáng)。

先說(shuō)下概念和差異:

腳本字符編碼:就是解釋器解釋腳本文件時(shí)使用的編碼格式,可以通過(guò) # -\*- coding: utf-8 -\*- 顯式指定
解釋器字符編碼:解釋器內(nèi)部邏輯過(guò)程中對(duì) str 類(lèi)型進(jìn)行處理時(shí)使用的編碼格式
Python2 中默認(rèn)把腳步文件使用 ASCII 來(lái)處理(歷史原因請(qǐng) Google)
Python2 中字符串除了 str 還有 Unicode,可以用 decode 和 encode 相互轉(zhuǎn)換
Python3 中默認(rèn)把腳步文件使用 UTF-8 來(lái)處理(終于默認(rèn)就支持中文了,贊)
Python3 中文本字符和二進(jìn)制分別使用 str 和 bytes 進(jìn)行區(qū)分,也是使用 decode 和 encode 進(jìn)行相互轉(zhuǎn)換

關(guān)于默認(rèn)腳本字符編碼,因?yàn)閷?duì)腳步文件處理的默認(rèn)編碼格式變了,所以很多針對(duì)內(nèi)容的處理,都發(fā)生了變化,比如下面這個(gè)腳本。

import sys

print(sys.getdefaultencoding())
print('中文')

使用 Python3.4 解釋器運(yùn)行結(jié)果如下:

> python34 test.py
utf-8
中文

使用 Python2.6 解釋器運(yùn)行結(jié)果如下:

> python26 test.py
  File "test.py", line 4
SyntaxError: Non-ASCII character '\xe4' in file test.py on line 4, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

使用 Python2.6 報(bào)錯(cuò)就是因?yàn)榈谝粭l說(shuō)的「Python2 中默認(rèn)把腳步文件使用 ASCII 來(lái)處理」,但是腳步文件包含了中文,ascii 又沒(méi)有覆蓋中文,所以報(bào)錯(cuò)。如果我們把腳步稍作修改:

# -*- coding: utf-8 -*-

import sys

print(sys.getdefaultencoding())
print('中文')

增加了腳本字符編碼的說(shuō)明,再次使用 Python2.6 解釋器運(yùn)行結(jié)果為:

> python26 test.py
ascii
涓枃

因?yàn)槊鞔_指定了腳步文件編碼格式為 utf-8,所以讀取沒(méi)問(wèn)題,也就是說(shuō)如果 Python2 腳本文件中包含了非 ASCII 字符時(shí),一定要顯式指定腳步文件編碼格式,對(duì)于 Python3 因?yàn)槟J(rèn)的腳步文件編碼格式就是 utf-8,所以沒(méi)有這個(gè)問(wèn)題(后面會(huì)有文章詳細(xì)討論這個(gè)問(wèn)題)。

但是我們回頭看下剛才的輸出,結(jié)果顯示為亂碼。

亂碼就涉及到另一個(gè)我們要說(shuō)的不同點(diǎn)解釋器字符編碼,因?yàn)槲覀兌x了 utf-8 格式讀取腳步內(nèi)容,但是因?yàn)?Python2.6 在 Windows 平臺(tái)上,默認(rèn)是使用 gbk 對(duì)字符進(jìn)行 decode 輸出,不信你看:

> python26
ActivePython 2.6.6.15 (ActiveState Software Inc.) based on
Python 2.6.6 (r266:84292, Aug 24 2010, 16:01:11) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s='中文'
>>> s
'\xd6\xd0\xce\xc4'
>>> s.decode('gbk').encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'
>>> print('\xd6\xd0\xce\xc4')
中文
>>> print('\xe4\xb8\xad\xe6\x96\x87')
涓枃

完整描述下上面亂碼出現(xiàn)的過(guò)程:
使用指定的腳本文件編碼 utf-8 格式讀取了「中文」,讀取到的字符串內(nèi)容為 '\xe4\xb8\xad\xe6\x96\x87',然后輸出時(shí) Python2.6 的解釋器使用默認(rèn)解釋器字符編碼 gbk 格式對(duì)讀取內(nèi)容進(jìn)行 encode 輸出,但是之前 utf-8 是 3 個(gè)字節(jié)長(zhǎng)度表示一個(gè)中文,而 gbk 是用 2 個(gè)字節(jié)長(zhǎng)度來(lái)表示中文,所以之前的 2 個(gè)中文,在輸出的時(shí)候就按照 3 個(gè)中文進(jìn)行編碼(encode),當(dāng)然就亂碼了,仔細(xì)看那個(gè)亂碼,就是 3 個(gè)字。

我們?cè)儆么a驗(yàn)證下上面說(shuō)的內(nèi)容:

# -*- coding: utf-8 -*-

import sys

print(sys.getdefaultencoding())
print('中文')
print('\xe4\xb8\xad\xe6\x96\x87')
print('\xe4\xb8\xad\xe6\x96\x87'.decode('gbk', 'ignore'))
print('\xd6\xd0\xce\xc4'.decode('gbk').encode('utf-8'))
print('中文'.decode('utf-8'))
print('\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
print('\xd6\xd0\xce\xc4')
print('\xd6\xd0\xce\xc4'.decode('gbk'))

看看輸出結(jié)果:

> python26 test.py
ascii
涓枃
涓枃
涓枃
涓枃
中文
中文
中文
中文

很明顯 gbk 格式解碼的十六進(jìn)制字符正常輸出為中文了,顯式使用 utf-8 對(duì) utf-8 格式的十六進(jìn)制字符進(jìn)行 decode 也輸出正常了。

同理,還可以看到另外 2 個(gè)現(xiàn)象:

把 py 文件用 utf-8 格式存儲(chǔ),并且包含「中文」字樣時(shí),如果使用 gbk 格式打開(kāi),也是看到「中文」顯示的亂碼和上面程序輸出的一致;
如果把 py 文件使用 gbk 格式存儲(chǔ),這時(shí)候 print('中文') 也顯示正常了;

亂碼的終極原因就是:對(duì)同一個(gè)字符串的 encode 和 decode 編碼格式不一致。

上面說(shuō)的這個(gè)問(wèn)題,如果文件存儲(chǔ)和腳本文件編碼都使用 utf-8 時(shí),使用 Python3.4 是沒(méi)有問(wèn)題的,因?yàn)?Python3 默認(rèn)的解釋器字符編碼是 utf-8 了,默認(rèn)就可以處理中文了。

總結(jié)下結(jié)論:
  1. Python2 腳步文件盡量使用 gbk 格式存儲(chǔ);同理 Python3 腳步文件盡量使用 utf-8 格式存儲(chǔ);
  2. Python2 腳步如果帶有中文字符時(shí),請(qǐng)務(wù)必在腳本開(kāi)頭聲明能支持中文的腳本文件編碼;
  3. Python2 中對(duì)同一個(gè)字符串的 encode 和 decode 編碼格式請(qǐng)保持一致;

說(shuō)明:本次所有測(cè)試腳本文件均保存為 utf-8 格式

本文原創(chuàng)發(fā)布于公眾號(hào)「sylan215」,十年測(cè)試?yán)媳脑瓌?chuàng)干貨,關(guān)注我,漲姿勢(shì)!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。


網(wǎng)站題目:Python2和Python3中默認(rèn)編碼的差異-創(chuàng)新互聯(lián)
分享路徑:http://weahome.cn/article/egpci.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部