使用Python通过sys.stdout编写Unicode字符串

26 浏览
0 Comments

使用Python通过sys.stdout编写Unicode字符串

假设暂时不能使用print(因此无法享受自动编码检测的好处)。那么我们只能使用sys.stdout。然而,sys.stdout太笨了,不能进行任何明智的编码。

现在,我们阅读Python维基页面PrintFails,并尝试以下代码:

$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
  sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout);

然而,这也不起作用(至少在Mac上)。原因如下:

>>> import locale
>>> locale.getpreferredencoding()
'mac-roman'
>>> sys.stdout.encoding
'UTF-8'

(UTF-8是终端理解的编码方式)。

所以,我们将上述代码更改为:

$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
  sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout);

现在,Unicode字符串可以正确地发送到sys.stdout,并在终端上正确地打印(sys.stdout连接到终端)。

这是在sys.stdout中编写Unicode字符串的正确方法吗?还是我应该做其他操作?

编辑:有时候(例如,将输出导入到less时),sys.stdout.encoding将是None。在这种情况下,上述代码将失败。

0
0 Comments

在Python中,当我们尝试通过sys.stdout将Unicode字符串写入控制台时,可能会遇到编码问题。这通常是因为控制台默认使用的编码与我们要写入的Unicode字符串的编码不匹配。

解决这个问题的方法是通过设置PYTHONIOENCODING环境变量来告诉Python控制台使用的编码。我们可以在终端中使用以下命令来设置编码为UTF-8:

export PYTHONIOENCODING=utf-8

然而,这种方法不能直接在Python代码中设置编码。我们可以通过以下代码片段来验证编码是否已设置,并在未设置时提醒用户在调用脚本之前设置编码:

if __name__ == '__main__':
    if (sys.stdout.encoding is None):
        print >> sys.stderr, "请设置Python环境变量PYTHONIOENCODING=UTF-8,例如:export PYTHONIOENCODING=UTF-8,在写入stdout时。"
        exit(1)

通过这种方式,我们可以确保在写入Unicode字符串之前,控制台的编码已正确设置,从而避免编码问题。

0
0 Comments

问题的原因是在使用sys.stdout输出Unicode字符串时可能会遇到编码问题。解决方法是通过检查是否直接连接到终端来确定使用终端的编码还是系统首选编码。同时,允许用户指定所需的编码,可以通过命令行选项进行设置,并使用optparse模块解析选项。另外,不要覆盖sys.stdout的自动编码器,而是创建自己的编码器并使用它,以避免潜在的问题。可以导入第三方库,直接将编码后的字节串写入sys.stdout。

0
0 Comments

在Python中,通过sys.stdout输出Unicode字符串时可能会遇到问题。原因是sys.stdout的默认编码可能与Unicode字符串的编码不匹配,导致输出乱码。为了解决这个问题,可以使用PYTHONIOENCODING这个可选的环境变量来设置默认编码。

PYTHONIOENCODING环境变量可以设置为用户希望的默认编码,这样就可以以与Python一致的方式获取用户所需的编码。你可以在Python手册的这个位置找到它。

那么,具体的解决方法是什么呢?可以按照以下步骤进行操作:

1. 打开Python手册,并找到PYTHONIOENCODING的说明。

2. 设置PYTHONIOENCODING环境变量为所需的默认编码。例如,如果你希望使用UTF-8编码,可以将PYTHONIOENCODING设置为"UTF-8"。

3. 在你的Python脚本中,使用sys.stdout输出Unicode字符串。

4. 运行脚本,你会发现输出的Unicode字符串现在正确地显示了。

总结起来,通过设置PYTHONIOENCODING环境变量,我们可以解决在使用sys.stdout输出Unicode字符串时出现的编码不匹配问题。这样我们就可以轻松地输出正确显示的Unicode字符串了。

0