python的乙個編譯碼錯誤

2021-06-22 12:04:42 字數 1737 閱讀 7654

python的乙個編譯碼錯誤

發表於2012/10/24由latlontude

(1)出錯的**

>>> a = u"test"

>>> b = "這些一看就"

>>> c = "%s:%s"%(a,b)

traceback (most recent call last):

file "", line 1, in unicodedecodeerror: 'ascii' codec can't decode byte 0xe8 in position 0: ordinal not in range(128)

(2)沒有出錯的**

>>> b = u"這些一看就"

>>> a = "test"

>>> c = "%s:%s"%(a,b)

兩者有什麼區別呢?

這裡的字串格式化預設是先把每個物件轉換為unicode的

(這裡是按照a,b的型別進行判斷確認最終輸出字串的編碼,如果a,b都沒有顯式宣告為unicode,則最終轉換的型別為編碼為sys.getdefaultencoding()得到的字符集,否則如果a/b任意乙個為unicode型別,則最終轉換為型別為unicode字串) 

。轉換時呼叫物件的decode方法, 除非顯示宣告字串物件為unicode編碼,否則系統認為預設的編碼方式是sys.getdefaultencoding(),這裡是ascii(0~128)。即轉換時會呼叫obj.decode(「ascii」),將obj字串轉換為unicode。

這樣對於1中的情形,a本身顯式宣告為unicode,不用轉換,b會呼叫 b.decode(「ascii」)來轉換為unicode物件.  對於2中的情形,b顯式宣告為unicode,不用轉換,a會呼叫a.decode(「ascii」).

本文測試時,終端使用的編碼方式是utf-8,這樣2中a的utf8編碼和ascii編碼一樣,這樣轉換為unciode就不會出錯。而1中的b的包含中文,由於終端為utf8,實質b是utf8編碼的,其編碼的位元組序中有超過0x7f的位元組,這樣在利用ascii來解碼就會有不能識別的字元,這樣就會報錯「 『ascii』 codec can』t decode byte 0xe8 in position 0: ordinal not in range(128)」。

補充:可以這樣設定

import sys

reload(sys)

sys.setdefaultencoding('utf8')

即使系統的預設編碼為utf8,而非ascii碼。這樣1中的錯誤也不會出現了。

另外如果:

>>> a = "test"

>>> b = "這樣在利用"

>>> c = "%s:%s"%(a,b)

>>> print type(c)

也不會報錯,因為a/b系統預設都是ascii的編碼。只是b由於終端設定為utf-8才顯示為中文。這裡就不會呼叫unicode來編碼了。雖然b的字元值超過了0x7f。

檢視b的二進位制:  顯然都是utf-8編碼的。(0xe8/0xe6….)

>>> b = "這樣在利用"

>>> import binascii

>>> binascii.b2a_hex(b)

'e8bf99e6a0b7e59ca8e588a9e794a8'

Cartographer編譯時的乙個錯誤

執行 catkin make isolated install use ninja結果 ninja j8 l8 in home jason project catkin ws build isolated ceres solver install 306 323 linking c executab...

編譯orbslam時的乙個錯誤

orbslam學習記錄 2020.10.14記錄 在編譯orbslam2的時候報錯為 usr local lib libopencv imgcodecs.so.3.4.10 undefined reference to tiffre 這樣的情況下需要修改orbslam master目錄下的cmake...

乙個手機簡訊息的編譯碼類

using system using system.text namespace slib 編碼格式 public enum g code 對整個簡訊息進行解碼 要解碼的資訊 解碼後的 號碼 解碼後的簡訊內容 簡訊時間戳 使用的編碼方式 成功返回true static public bool dec...