成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Python2和Python3中默認編碼的差異

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

創(chuàng)新互聯(lián)公司是專業(yè)的碾子山網(wǎng)站建設(shè)公司,碾子山接單;提供成都網(wǎng)站制作、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行碾子山網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

先說下概念和差異:

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

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

import sys

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

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

> python34 test.py
utf-8
中文

使用 Python2.6 解釋器運行結(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 報錯就是因為第一條說的「Python2 中默認把腳步文件使用 ASCII 來處理」,但是腳步文件包含了中文,ascii 又沒有覆蓋中文,所以報錯。如果我們把腳步稍作修改:

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

import sys

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

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

> python26 test.py
ascii
涓枃

因為明確指定了腳步文件編碼格式為 utf-8,所以讀取沒問題,也就是說如果 Python2 腳本文件中包含了非 ASCII 字符時,一定要顯式指定腳步文件編碼格式,對于 Python3 因為默認的腳步文件編碼格式就是 utf-8,所以沒有這個問題(后面會有文章詳細討論這個問題)。

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

亂碼就涉及到另一個我們要說的不同點解釋器字符編碼,因為我們定義了 utf-8 格式讀取腳步內(nèi)容,但是因為 Python2.6 在 Windows 平臺上,默認是使用 gbk 對字符進行 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)的過程:
使用指定的腳本文件編碼 utf-8 格式讀取了「中文」,讀取到的字符串內(nèi)容為 '\xe4\xb8\xad\xe6\x96\x87',然后輸出時 Python2.6 的解釋器使用默認解釋器字符編碼 gbk 格式對讀取內(nèi)容進行 encode 輸出,但是之前 utf-8 是 3 個字節(jié)長度表示一個中文,而 gbk 是用 2 個字節(jié)長度來表示中文,所以之前的 2 個中文,在輸出的時候就按照 3 個中文進行編碼(encode),當然就亂碼了,仔細看那個亂碼,就是 3 個字。

我們再用代碼驗證下上面說的內(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 格式解碼的十六進制字符正常輸出為中文了,顯式使用 utf-8 對 utf-8 格式的十六進制字符進行 decode 也輸出正常了。

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

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

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

上面說的這個問題,如果文件存儲和腳本文件編碼都使用 utf-8 時,使用 Python3.4 是沒有問題的,因為 Python3 默認的解釋器字符編碼是 utf-8 了,默認就可以處理中文了。

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

說明:本次所有測試腳本文件均保存為 utf-8 格式

本文原創(chuàng)發(fā)布于公眾號「sylan215」,十年測試老兵的原創(chuàng)干貨,關(guān)注我,漲姿勢!

本文題目:Python2和Python3中默認編碼的差異
網(wǎng)址分享:http://jinyejixie.com/article18/jpcodp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、服務(wù)器托管App開發(fā)、虛擬主機、企業(yè)網(wǎng)站制作外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
舞阳县| 江陵县| 雅安市| 萍乡市| 桐庐县| 公安县| 安龙县| 隆昌县| 安顺市| 阳泉市| 安国市| 班戈县| 甘泉县| 安龙县| 丹阳市| 临城县| 平罗县| 玉林市| 丰镇市| 山阳县| 邓州市| 个旧市| 安义县| 宣汉县| 邢台县| 洪泽县| 会同县| 石嘴山市| 梁山县| 丁青县| 连南| 富阳市| 潜江市| 开江县| 天等县| 东方市| 通城县| 罗田县| 资中县| 平南县| 定南县|