我正在尝试将一个Unicode字符从Python 3打印到web。在Python中,我可以运行:
print("Content-Type: text/html; charset=utf-8\n")
print("\u00EA")当从命令行运行时,它将正确地吐出:
内容-类型: text/html;charset=utf-8
维纳
但是,当在Apache下作为CGI脚本从web运行时,它会引发一个错误:
UnicodeEncodeError:'ascii‘编解码器不能将字符'\xea’编码到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=发布于 2020-09-23 15:00:56
由于用户的反馈,我能够拼凑出一个解决方案:
必须包含charset=utf-8.
Content-Type行必须包括SetEnv LANG en_US.UTF-8.一个很好的调试工具是打印sys.stdout.encoding的值,它应该返回"UTF-8",而不是"ANSI_X3.4-1968“。
发布于 2020-09-23 06:53:45
您必须显式地将数据编码为utf-8 (否则Python会尝试猜测,而且在您的示例中,它猜到了ASCII,它没有很好地工作)。所以,这样做:
sys.stdout.buffer.write(text.encode('utf-8'))这会纠正你的错误。请注意,我使用的是sys.stdout.buffer.write而不是print,因为buffer.write可以处理原始字节( UTF-8是原始字节数组,而不是字符串)。
此外,您还应该告诉客户端(浏览器),数据被用作utf-8 (否则浏览器也必须猜测,这可能成功,但最好是显式的)。
print("Content-Type: text/html; charset=utf-8\n")发布于 2020-09-23 07:06:02
读取文件时,请使用上下文管理器。
后台的场景打开和关闭文件是为你做的,所以你不需要记住它。
with open(filename , encoding='utf-8') as f:
text = f.read()
print(text)https://stackoverflow.com/questions/64022468
复制相似问题