python的乙個編譯碼錯誤
發表於2012/10/24由latlontude
(1)出錯的**
(2)沒有出錯的**>>> 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)
>>> 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)」。
補充:可以這樣設定
即使系統的預設編碼為utf8,而非ascii碼。這樣1中的錯誤也不會出現了。import sys
reload(sys)
sys.setdefaultencoding('utf8')
另外如果:
也不會報錯,因為a/b系統預設都是ascii的編碼。只是b由於終端設定為utf-8才顯示為中文。這裡就不會呼叫unicode來編碼了。雖然b的字元值超過了0x7f。>>> a = "test"
>>> b = "這樣在利用"
>>> c = "%s:%s"%(a,b)
>>> print type(c)
檢視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...