用python3编码打印到stdout

2024-06-02 06:04:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python 3程序,可以从Windows-1252编码的文件中读取一些字符串:

with open(file, 'r', encoding="cp1252") as file_with_strings:
    # save some strings

我后来想写信给stdout。我试过:

^{pr2}$

我在这儿挠头。我想打印我从文件中得到的字符串,就像它在cp1252中显示的那样。(在我的终端中,当我使用more $file时,这些字符会显示为问号,因此我的终端可能是ascii格式的。)

希望能澄清一下!谢谢!在


Tags: 文件字符串程序终端编码windowssaveas
3条回答

When you encode with cp1252, you have to decode with the same.

例如:

import sys
txt = ("hi hello\n").encode("cp1252")
#print((txt).decode("cp1252"))
sys.stdout.buffer.write(txt)
sys.stdout.flush()

这将在解码后打印“hi hello\n”(在cp1252中编码)。在

你要么在用管道连接脚本,要么你的区域设置被破坏了。您应该修复环境,而不是将脚本修复到环境中,因为这会使脚本变得非常脆弱。在

如果使用管道,Python假设输出应该是“ASCII”,并将stdout的编码设置为“ASCII”。在

在正常情况下,Python使用locale来计算要应用于stdout的编码。如果您的区域设置被破坏(未安装或损坏),Python将默认为“ASCII”。区域设置“C”也将为您提供“ASCII”编码。在

通过键入locale检查您的区域设置,并确保没有返回错误。E、 g

$ locale
LANG="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_CTYPE="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_ALL=

如果所有其他方法都失败了或者您正在管道中,您可以通过设置PYTHONIOENCODING环境变量来覆盖Python的区域设置检测。E、 g

^{pr2}$

记住您的shell有一个语言环境,您的终端有一个编码-它们都需要正确设置

对于那些有同样问题的人,我最后做了:

to_print = (some_string + "\n").encode("cp1252")
sys.stdout.buffer.write(to_print)
sys.stdout.flush() # I write a ton of these strings, and segfaulted without flushing

相关问题 更多 >