亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

UnicodeEncodeError:“charmap”編解碼器不能將-字符映射編碼為<未定義>

UnicodeEncodeError:“charmap”編解碼器不能將-字符映射編碼為<未定義>

慕哥9229398 2019-06-24 16:29:10
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個贊

基于DirkSt cker的回答,這里為Python 3的打印函數提供了一個簡潔的包裝函數。用它就像你會用印刷品一樣。

作為額外的獎勵,與其他答案相比,這不會將文本打印為字節數組(‘b“content”’),而是作為普通字符串(‘content’)打印,因為最后一個解碼步驟。

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')


查看完整回答
反對 回復 2019-06-24
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

為了調試目的,可以使用print(repr(data)).

若要顯示文本,請始終打印Unicode。不要硬編碼環境中的字符編碼,例如cp850在你的劇本里。要解碼http響應,請參見用Python獲取HTTP響應的字符集/編碼的好方法.

要將Unicode打印到Windows控制臺,您可以使用win-unicode-console包裝.


查看完整回答
反對 回復 2019-06-24
  • 3 回答
  • 0 關注
  • 1583 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號