【发布时间】:2021-01-09 07:56:35
【问题描述】:
我正在尝试将 Python 3 中的 Unicode 字符打印到网络上。在 Python 中我可以运行:
print("Content-Type: text/html; charset=utf-8\n")
print("\u00EA")
从命令行运行时,它会正确吐出:
内容类型:文本/html;字符集=utf-8
ê
但是当在 Apache 下作为 CGI 脚本从 Web 运行时,它会抛出错误:
UnicodeEncodeError: 'ascii' codec can't encode character '\xea' in 位置 0:序数不在范围内(128)
关于如何让 Python 3 将 UTF-8 打印到网络上有什么建议吗?谢谢!
编辑:locale 在我的帐户和www-data(Apache 的帐户)中的输出是:
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
【问题讨论】:
-
只是不要使用
printf?配置操作系统区域设置以使用 UTF8? -
顺便说一句,这个页面就像所有其他网页一样都是 UTF8。不需要特殊处理,这就是为什么您可以阅读这些越南语字符而无需对其进行编码或联系 SO 的团队要求特殊处理。
-
运行 apache 进程的用户的区域设置是什么?
-
问题是 printf 和控制台。您正在写入控制台,而不是文件,这意味着 Python 必须使用控制台的编码。如果您的环境配置为使用 Latin1 或更糟的 US-ASCII,则文本将被破坏。在 Linux 上,这由
LC_ALL控制。 Windows 本身是 UnicodeBUT,console GUI 是特定于区域设置的,需要设置来显示 UTF8。不过,这不应该影响进程到进程的通信 -
这个答案看起来像你想要的stackoverflow.com/a/19574801/5320906。选项 4(通过 Apache 的
$LANG看起来是最好的方法,在其他答案中建议摆弄sys.defaultencoding但这很 hacky imo。
标签: python utf-8 python-unicode