引用 Python 編碼基礎

2021-08-25 17:23:32 字數 3422 閱讀 7322

首先明確的概念:

關於檔案開頭的」編碼指示」,也就是 # -*- coding: -*- 這個語句。python 預設指令碼檔案都是 anscii 編碼的,當檔案中有非 anscii 編碼範圍內的字元的時候就要使用」編碼指示」來修正。

關於 sys.defaultencoding,這個在解碼沒有明確指明解碼方式的時候使用。比如我有如下**:

> #! /usr/bin/env python

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

> s = 『中文』  # 注意這裡的 str 是 str 型別的,而不是 unicode

> s.encode(『gb18030′)

這句**將 s 重新編碼為 gb18030 的格式,即進行 unicode -> str 的轉換。因為 s 本身就是 str 型別的,因此python 會自動的先將 s 解碼為 unicode ,然後再編碼成 gb18030。因為解碼是python自動進行的,我們沒有指明解碼方式,python 就會使用 sys.defaultencoding 指明的方式來解碼。很多情況下 sys.defaultencoding 是anscii,如果 s 不是這個型別就會出錯。拿上面的情況來說,我的 sys.defaultencoding 是 anscii,而 s 的編碼方式和檔案的編碼方式一致,是 utf8 的,所以出錯了:

> unicodedecodeerror: 『ascii』 codec can』t decode byte 0xe4 in position

> 0: ordinal not in range(128)

對於這種情況,我們有兩種方法來改正錯誤:

一是明確的指示出 s 的編碼方式

> #! /usr/bin/env python

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

> s = 『中文』

> s.decode(『utf-8′).encode(『gb18030′)

二是更改 sys.defaultencoding 為檔案的編碼方式

> #! /usr/bin/env python

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

> import sys

> reload(sys) # python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入

> sys.setdefaultencoding(『utf-8′)

> str = 『中文』

> str.encode(『gb18030′)

幾個例子說明:

>>> a = 「我」

>>> b = unicode(a,」gb2312″)

>>> a.__class__

>>> b.__class__

看出來了吧,兩種字串。再來

>>> a

『\xce\xd2′

>>> b

u』\我′

變數a是兩個字元,b是乙個unicode字元。關於這兩種字串,python文件–>lang gereference–>datamodel–>the standard type hierarchy–>seqnces,有一些strings,unicode的描述。

>>> z = u」我」

>>> #這種**,其實什麼都不是。

>>> z.__class__

>>> z

u』\xce\xd2′

decode就是把其他編碼轉換為unicode,等同於unicode函式;encode就是把unicode編碼的字串轉換為特定編碼。a是str型別的,所以再用encode會報錯。用print輸出時會呼叫預設編碼轉換為系統編碼?

>>> a.decode(「gb2312″)

u』\我′

>>> print a.decode(「gb2312″)

我 >>> a.encode(「gb2312″)

traceback (most recent call last):

file 「」, line 1, in ?

unicodedecodeerror: 『ascii』 codec can』t decode byte 0xce in position 0: ordinal not in range(128)

b是unicode型別,列印時需要先encode(編碼)成系統編碼

>>> print b.encode(「gb2312″) 我

>>> b.encode(「gb2312″)

『\xce\xd2′

>>> b.decode(「gb2312″)

traceback (most recent call last):

file 「」, line 1, in

unicodeencodeerror: 『ascii』 codec can』t encode character u』\我′ in position 0: ordinal not in     range(128

在python中,可以對string呼叫decode和encode方法來實現轉碼。比如,若要將某個string物件s從gbk內碼轉換為utf-8,可以如下操作s.decode(』gbk』).encode(』utf-8′)

可是,在實際開發中,這種辦法經常會出現異常:

unicodedecodeerror: 『gbk』 codec can』t decode bytes in position 30664-30665: illegal multibyte seqnce

這是因為遇到了非法字元——尤其是在某些用c/c++編寫的程式中,全形空格往往有多種不同的實現方式,比如\xa3\xa0,或者\xa4 \x57,這 些字元,看起來都是全形空格,但它們並不是「合法」的全形空格(真正的全形空格是\xa1\xa1),因此在轉碼的過程中出現了異常。這樣的問題很讓人頭疼,因為只要字串中出現了乙個非法字元,整個字串——有時候,就是整篇文章——就都無法轉碼。

下面是完美的解決辦法:

s.decode(』gbk』, 『ignore』).encode(』utf-8′)

因為decode的函式原型是decode([encoding], [errors='strict']),可以用第二個引數控制錯誤處理的策略,預設的引數就是strict,代表遇到非法字元時丟擲異常;如果設定為ignore,則會忽略非法字元;如果設定為replace,則會用?取代非法字元;如果設定為xmlcharrefreplace,則使用xml的字元引用。

python基礎 中文編碼

python 檔案中如果未指定編碼,在執行過程會出現報錯 python中預設的編碼格式是 ascii 格式,在沒修改編碼格式時無法正確列印漢字,所以在讀取中文時會報錯。解決方法為只要在檔案開頭加入 coding utf 8 或者 coding utf 8 就行了 pycharm 設定步驟 進入 fi...

python 基礎 字元編碼

編碼基礎 由於每個國家都有自己的字元,所以其對應關係也涵蓋了自己國家的字元,但是以上編碼都存在侷限性,即 僅涵蓋本國字元,無其他國家字元的對應關係。應運而生出現了萬國碼,他涵蓋了全球所有的文字和二進位制的對應關係。unicode 2 4位元組 已經收錄136690個字元,並還在一直不斷擴張中.uni...

python基礎 字元編碼

任何乙個程式想要執行,必須先有硬碟載入到記憶體,然後由cpu去記憶體取只執行。執行著的應用程式的資料,必須在記憶體執行。python執行檔案的三步,首先把python檔案直譯器讀取到記憶體上,然後應用程式 文字檔案讀取到記憶體上,最後python直譯器對程式 進行編譯成計算機識別的 我們寫的檔案要想...