2

我需要输出一些字符串(到标准输出),因为 Windows 控制台在 cp437 中工作,如果字符串包含 cp437 之外的任何字符,则会引发异常。

我解决了这个问题

encoding=sys.stdout.encoding
pathstr = path.encode(encoding,errors="replace").decode(encoding)
print(pathstr)

我想输出path在哪里。str我可以用“?”代替字符

这似乎不太好,因为它转换为字节数组并返回到 str。

有没有更好的方法来实现这一目标?

我还是 python 新手(也许一周),我正在使用 Win7 32 位和 cpython 3.3

4

3 回答 3

3

这似乎不太好,因为它转换为字节数组并返回到 str。

如果要将原始字节写入流,请使用.buffer

pathbytes= path.encode(encoding, errors= 'replace')
sys.stdout.buffer.write(pathbytes)

...哦,当问题 1602出现时,我们可以避免 Windows 命令提示符的 Unicode 恐怖...

于 2013-04-29T01:20:35.823 回答
1

我可以用“?”代替字符

您可以设置PYTHONIOENCODING 环境变量

C:\> set PYTHONIOENCODING=cp437:replace

并直接打印 Unicode 字符串:

print(path)

在这种情况下,如果您要重定向到文件;您可以将 PYTHONIOENCODING 设置为 utf-8 并获得正确的完整输出。

您还可以从相应的 Python 错误中尝试WriteConsoleW()基于 - 的解决方案,看看它们是否适用于 Python 3.3,例如:

import _win_console
_win_console.install_unicode_console()

print("cyrillic: цык.")

_win_console来自win_console.patch哪里。在这种情况下,您不需要设置环境变量,它应该适用于任何代码页(使用适当的控制台字体,它甚至可能显示当前代码页之外的字符)

在 Windows 控制台中打印 Unicode 问题的所有解决方案都有缺点(有关所有血腥细节,请参阅错误跟踪器中的讨论和参考链接)

于 2013-04-29T03:46:16.087 回答
0

我听过的关于 Unicode 的最好建议是制作一个 Unicode 三明治:

  1. 立即将程序中的任何传入文本转换为 unicode。
  2. 在您的程序中专门处理 Unicode。
  3. 导出为您想要用于输出的任何序列化格式。

在这种情况下,您基本上就是这样做的。在更长的程序中,以您描述的方式执行此操作是有意义的,我认为您会对此感到更自在。

我要做的唯一更改是编码为 utf-8,然后在输出时解码为 cp437。

于 2013-04-27T23:27:56.937 回答