我正在编写一个 Python (Python 3.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文档)直到我停止使用 IDLE GUI for Windows 而改用 Windows 控制台之前,这看起来还不错。返回的页面有一个 U + 2014字符(em-ash) ,打印函数在 Windows GUI 中翻译得很好(我推测是代码页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'))
现在它将冒犯字符“ー”替换为 ?
。不是理想的情况下(连字符应该是一个更好的替代品) ,但足以满足我的目的。
从我的解决方案中,有几件事我不喜欢。
问题不在于 emash (我可以想出几种解决这个特殊问题的方法) ,而是我需要编写健壮的代码。我提供的数据从数据库和数据可以回来的页面。我可以预见到许多其他相互矛盾的情况: ‘ Á’U + 00 c1(在我的数据库中是可能的)可以转换成 CP-850(DOS/Windows 控制台西欧语言编码) ,但不能转换成 CP-437(美国英语编码,这在许多 Windows 安装中是默认的)。
那么,问题来了:
有没有更好的解决方案,使我的代码不可知的输出接口编码?