我需要输出一些字符串(到stdout),因为windows控制台在cp437中工作,如果字符串包含cp437之外的任何字符,则抛出异常。
我通过
解决了这个问题encoding=sys.stdout.encoding
pathstr = path.encode(encoding,errors="replace").decode(encoding)
print(pathstr)
其中path
是我要输出的str
。我很好用“?”替换字符
这似乎不太好,因为它转换为字节数组并返回str。
有没有更好的方法来实现这一目标?
我仍然是python的新手(可能是一周),我正在使用带有cpython 3.3的Win7 32位
答案 0 :(得分:3)
这似乎不太好,因为它转换为字节数组并返回str。
如果要将原始字节写入流,请使用.buffer
:
pathbytes= path.encode(encoding, errors= 'replace')
sys.stdout.buffer.write(pathbytes)
...哦,issue 1602出现的那天,我们可以避免Windows命令提示符的Unicode恐怖......
答案 1 :(得分:1)
我很好用“?”替换字符
您可以设置PYTHONIOENCODING environment variable:
C:\> set PYTHONIOENCODING=cp437:replace
直接打印Unicode字符串:
print(path)
在这种情况下,如果您要重定向到文件;你可以将PYTHONIOENCODING设置为utf-8并获得正确的完整输出。
您还可以尝试the corresponding Python bug中基于WriteConsoleW()
的解决方案,看看它们是否适用于Python 3.3,例如:
import _win_console
_win_console.install_unicode_console()
print("cyrillic: цык.")
_win_console
is from win_console.patch
。在这种情况下,您不需要设置环境变量,它应该适用于任何代码页(with an appropriate console font, it might even show characters outside the current codepage)。
在Windows控制台中打印Unicode问题的所有解决方案都存在缺陷(see the discussion and the reference links in the bug tracker for all the gory details)。
答案 2 :(得分:0)
我听过关于Unicode的最好建议是制作Unicode三明治:
在这种情况下,你基本上就是这么做的。在较长的程序中,以您描述的方式执行此操作是有意义的,我认为您会对此感到更舒服。
我所做的唯一改变是编码为utf-8,然后在输出时解码为cp437。