【问题标题】:Python 3 UTF-8 bug on Widows?寡妇上的 Python 3 UTF-8 错误?
【发布时间】:2020-07-26 11:33:58
【问题描述】:

我正在尝试从包含 utf-8 字符的 Python 3 HTML 打印。下面的程序适用于 Python 2 和 Mac 和 Linux 上的 Python 3。但在 Windows 上,我必须删除行 <meta charset='UTF-8'> 才能正确显示 utf 字符。我尝试使用 # -- coding: UTF-8 -- 但这也无济于事。 这是 Python 3 中的错误吗?

print( "Content-type: text/html;\n")
print( """<!DOCTYPE html>
<html><head>
    <meta charset="UTF-8">
</head><body>
    <p>¡Hola Señor Müller!</p>
</body></html>
""")

【问题讨论】:

  • print默认将文本写入sys.stdout,默认使用locale.getpreferredencoding()返回的编码对文本进行编码。在 Windows 中,这是进程的活动代码页,默认为系统编码,默认为系统区域设置的 ANSI 代码页。在 Windows 10 中,进程的活动代码页可以在应用程序清单中设置为 UTF-8,但 python.exe 不会设置此设置。 Windows 10 还允许将系统编码设置为 UTF-8,但默认情况下未启用。因此,首选编码可能是您系统区域设置的 ANSI 代码页。
  • 谢谢。最好的解决方法是什么?
  • 打印到什么地方?终端使用很重要。例如,将上面的内容粘贴到运行 Python 3 的cmd.exe 中效果很好。它是 CGI 脚本吗?环境很重要。是失败还是打印不正确?追溯?
  • 这个程序被传递到 Apache 网络服务器执行。它有效,但 utf 字符显示为问号
  • @MarkTolonen,我假设 stdout 被重定向到文件或管道,而不是控制台(即以 python.exe 作为客户端的 conhost.exe - 而不是 cmd.exe)。不太可能有人将 HTML 写入控制台,只是为了将其复制并粘贴到文件中以在 Web 浏览器中显示。

标签: python-3.x windows utf-8


【解决方案1】:

print 没有发送编码为 UTF-8 的数据,尽管这是您声明的。对于 CGI 脚本,您可以使用以下命令覆盖 stdout 默认编码:

import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')

【讨论】:

  • 在环境中,您还可以设置PYTHONIOENCODING=utf-8sys.std*文件使​​用UTF-8。在 3.7+ 中,通过PYTHONUTF8=1 为所有 I/O 提供 UTF-8 模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 2019-04-02
  • 2011-08-26
  • 2013-08-30
  • 2014-10-28
  • 1970-01-01
相关资源
最近更新 更多