我正在编写一个 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 文档),直到我停止使用 Windows 的 IDLE GUI 并改用 Windows 控制台之前,它似乎还可以。返回的页面有一个 U+2014 字符(破折号),打印功能在 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'))
现在它将有问题的字符“-”替换为?
. 不是理想的情况(连字符应该是更好的替代品)但足以满足我的目的。
我的解决方案中有几件事我不喜欢。
- 代码在所有的解码、编码和解码中都很丑陋。
- 它解决了这种情况的问题。如果我为使用其他编码(latin-1、cp437、回到 cp1252 等)的系统移植程序,它应该能够识别目标编码。它不是。(例如,当再次使用 IDLE GUI 时,emdash 也会丢失,这在以前没有发生过)
- 如果将 emdash 翻译成连字符而不是审讯号,那就更好了。
问题不在于 emdash(我可以想出几种方法来解决这个特别的问题),但我需要编写健壮的代码。我正在向页面提供来自数据库的数据,并且该数据可以返回。我可以预料到许多其他冲突的情况:'Á' U+00c1(可能在我的数据库中)可以转换为 CP-850(用于西欧语言的 DOS/Windows 控制台编码)但不能转换为 CP-437(用于美国的编码)英语,这是许多 Windows 安装中的默认设置)。
所以,问题:
是否有更好的解决方案使我的代码与输出接口编码无关?