UnicodeEncodeError:“charmap”編解碼器不能將-字符映射編碼為<未定義>,打印函數我正在編寫Python(Python3.3)程序,使用POST方法將一些數據發送到網頁。在調試過程中,我主要是獲取頁面結果并將其顯示在屏幕上。print()功能。代碼如下:conn.request("POST", resource, params, headers)response = conn.getresponse()print(response.status, response.reason)data = response.read()
print(data.decode('utf-8'));這個HTTPResponse .read()方法返回bytes元素編碼頁面(這是一個格式良好的UTF-8文檔),直到我停止對Windows使用空閑GUI,轉而使用Windows控制臺為止,這似乎還不錯。返回的頁面有一個U+2014字符(em-破折號),打印函數在WindowsGUI中翻譯得很好(我猜代碼頁1252),但在Windows控制臺(代碼頁850)中沒有。鑒于strict默認行為我得到以下錯誤:UnicodeEncodeError: 'charmap' codec can't encode character '\u2014' in position 10248: character maps to <undefined>我可以用這個非常難看的代碼來修復它:print(data.decode('utf-8').encode('cp850','replace').decode('cp850'))現在,它將冒犯性字符“-”替換為?..不是理想的情況(連字符應該是一個更好的替代),但足夠好我的目的。有幾件事我不喜歡從我的解決方案。在所有這些解碼、編碼和解碼中,代碼都是丑陋的。它解決了這個案子的問題。如果我使用其他編碼(拉丁文-1,cp 437,回cp 1252等)將程序移植到系統它應該識別目標編碼。但事實并非如此。(例如,當再次使用空閑的GUI時,Emdash s也會丟失,這在以前沒有發生過)如果埃達什能翻譯成連字符而不是審訊聲,那就更好了。問題不在于Emdash(我可以想出解決這個問題的幾種方法),但我需要編寫健壯的代碼。我給頁面提供了數據庫中的數據,這些數據可以返回。我可以預見到許多其他相互矛盾的情況:“U+00c1”(在我的數據庫中是可能的)可以轉換為CP-850(DOS/Windows控制臺編碼,用于西歐語言),但不能轉換為CP-437(美國英語的編碼,這在許多Windows分期付款中都是默認的)。因此,問題是:是否有更好的解決方案使我的代碼與輸出接口編碼無關?
3 回答

互換的青春
TA貢獻1797條經驗 獲得超6個贊
def uprint(*objects, sep=' ', end='\n', file=sys.stdout): enc = file.encoding if enc == 'UTF-8': print(*objects, sep=sep, end=end, file=file) else: f = lambda obj: str(obj).encode(enc, errors='backslashreplace').decode(enc) print(*map(f, objects), sep=sep, end=end, file=file)uprint('foo')uprint(u'Antonín Dvo?ák')uprint('foo', 'bar', u'Antonín Dvo?ák')

素胚勾勒不出你
TA貢獻1827條經驗 獲得超9個贊
print(repr(data))
.
cp850
win-unicode-console
添加回答
舉報
0/150
提交
取消