python中的編碼方式

2021-08-21 02:47:16 字數 3101 閱讀 2792

這裡我們以python2.7為例講解python的編碼方式

python2.7的預設編碼方式為ascii字符集,這裡所說的編碼方式指執行編碼方式,在程式設計過程中,有三個地方都涉及到編碼方式:分別是原始碼編碼方式(.py檔案的字符集),執行編碼方式,執行環境編碼方式,這裡不詳細贅述:詳見

所以在原始檔的開頭,我們往往需要加上

# -*- coding:utf-8 -*-
或者

# -*- coding:gbk -*-
等等來指定乙個確定的執行編碼方式(記憶體中載入的字串使用的就是執行編碼方式,c語言中編譯鏈結的可執行檔案中字串的編碼方式也是執行編碼方式),若不指定,python2.7預設使用ascii(無論原始碼編碼方式是什麼,python直譯器都將使用ascii讀取原始檔,且如果碰到ascii之外的字元,則報錯),但是python3.6在不指定的情況下,執行編碼方式預設使用utf-8編碼,所以在這種情況下,python3.6無需顯示指定utf-8為執行編碼方式。(這一點和c語言的vs的cl.exe等編譯器相似,在不指定執行編碼方式時,cl.exe預設使用gbk編碼,gcc則預設使用與原始碼編碼方式一致的編碼,但python和c語言編譯器還有不同,c語言允許原始碼編碼方式和執行編碼方式不一致,並且編譯器會自動將原始碼中字串轉碼成為執行編碼方式相應的字串,即exe檔案中的字串常量編碼與原始檔中的字串編碼不同,但python如果原始碼編碼與執行編碼不一致,將出現亂碼,甚至直接報錯),c語言部分可參考

重點:

無論是python2.7還是python3.6,執行編碼方式和原始碼編碼方式必須一致,雖然檔案開頭# -*-coding:*** -*-

用於指定執行編碼方式,但是也會決定python直譯器讀取原始檔時的編碼方式,如果原始檔是gbk格式,但是開頭***為utf-8,那麼python直譯器將會以utf-8編碼讀取gbk格式的檔案,嚴重時將會導致錯誤,所以,一定要保證***和原始檔的編碼方式一致,即執行編碼方式和原始碼編碼方式一致。

理論上,如果站在c語言中cl.exe編譯器的角度來套用python,則無論.py檔案的編碼方式是什麼(只要python.exe直譯器能夠識別),都與執行結果無關,執行結果只與執行編碼方式有關,但上述已說明python中必須保證原始碼編碼方式和執行編碼方式一致。另外執行結果的展現方式和環境編碼方式有關,例如如果終端的編碼方式為utf-8,但是python卻輸出gbk的字元流( 很容易實現,例如:print("你好".decode("utf-8").encode("gbk"))  (py27語法)print("你好".encode("gbk"))(py36語法)),則終端會顯示亂碼,只需改變終端的編碼方式為gbk,即可正常顯示,這裡終端的編碼方式就是環境編碼方式。另外,假如終端的編碼方式為utf-8,如果接收到unicode的字元編碼流,也可以正常識別,但是終端為gbk就不行。

python2.7中有兩個函式encode()和decode(),是字串型別的成員函式,encode()功能是編碼,decode()功能是解碼,那麼用什麼字元流來進行編碼,又解碼成什麼字元流呢,答案是unicode,decode()函式功能就是將任何形式的編碼字串,解碼成unicode字符集,encode()函式的功能是將unicode字元流編碼成指定的字符集,這兩個函式都是圍繞unicode展開的。

python中任意兩種不同字元編碼的轉換都是以unicode為基石的,在python2.7即使我們想要將utf-8的字串直接轉換成gbk編碼的字串,也會在encode()函式呼叫前先隱式的以預設方式呼叫decode(),但由於python2.7的預設執行編碼方式為ascii,decode()呼叫時預設傳遞的引數也規定為ascii,所以將導致解碼失敗(以ascii字符集來解碼utf-8導致的失敗),下一步編碼也就無法進行。要想成功,必須通過顯示呼叫str.decode("utf-8").encode("gbk"),顯示指定解碼方式;在python3中不支援直接將一種編碼的bytes型別轉換成另一種編碼的bytes型別

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

import sys

print sys.getdefaultencoding() #列印預設執行編碼方式

str = "你好"

#以下一句出錯是因為在encode前python會自動呼叫decode()先將

#字串解碼為unicode,然後在進行編碼,由於預設呼叫decode()

#python2.7中decode()函式的預設引數是ascii,所以會出錯,我們

#應該顯示呼叫decode("utf-8")後再呼叫encode("gbk"),如下第二行

b.    python2中unicode和python3中的str本質一樣,是一組unicode位元組流,一般都只用於顯示,python2中如果想直接宣告unicode型別,直接在字串前面加u;

c.    python2中定義乙個str型別,例如str = "hello",它將採用開頭指定的編碼方式(預設ascii)來儲存str;

d.    python3中定義乙個str型別,無論開頭指定的編碼方式是什麼(不指定,預設utf-8),str型別都是unicode字元編碼來儲存,我們可以通過str.encode("***"),來生成***編碼型別的bytes型別(所以,個人認為:python3中開頭指定編碼方式的意義主要是告訴python直譯器應該以何種字元編碼讀取.py檔案,若不指定,則預設utf-8,而不是像python2那樣還決定str型別的內部編碼方式)

python3

表現轉換

作用str

bytes

位元組encode

儲存unicode

str字元

decode

顯示參考:

Python中的幽靈 編碼方式

首先要搞懂本地作業系統編碼與系統編碼的區別 本地作業系統編碼方式與作業系統有關,linux預設編碼方式為utf 8,windows預設編碼方式為gbk 系統編碼方式與編譯器or直譯器有關,python3直譯器預設編碼方式為unicode。編碼方式不僅僅代表編碼,也包括解碼,因為編碼與解碼是相對應的。...

python編碼方式

檢視編碼方式 import chardet print chardet.detect str str為string 位元組序 若寫入時以mode a encoding utf 16 方式執行,則會在內容寫入前新增標誌 xff xfe 若以 mode wb encoding utf 16 方式執行,則...

python 編碼方式總結

python 編碼方式總結 python 內部使用 unicode 編碼 t 北京 t xe5 x8c x97 xe4 xba xac 1 urllib.quote t 將t轉換為 16進製制編碼 e5 8c 97 e4 ba ac urllib.unquote e5 8c 97 e4 ba ac ...