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
提交
取消