首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Python 3中的UTF-8字符打印到web上

将Python 3中的UTF-8字符打印到web上
EN

Stack Overflow用户
提问于 2020-09-23 06:48:20
回答 3查看 1.7K关注 0票数 0

我正在尝试将一个Unicode字符从Python 3打印到web。在Python中,我可以运行:

代码语言:javascript
复制
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的帐户)中的输出是:

代码语言:javascript
复制
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=
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-23 15:00:56

由于用户的反馈,我能够拼凑出一个解决方案:

必须包含charset=utf-8.

  • Apache's配置文件的Content-Type行必须包括SetEnv LANG en_US.UTF-8.

一个很好的调试工具是打印sys.stdout.encoding的值,它应该返回"UTF-8",而不是"ANSI_X3.4-1968“。

票数 1
EN

Stack Overflow用户

发布于 2020-09-23 06:53:45

您必须显式地将数据编码为utf-8 (否则Python会尝试猜测,而且在您的示例中,它猜到了ASCII,它没有很好地工作)。所以,这样做:

代码语言:javascript
复制
sys.stdout.buffer.write(text.encode('utf-8'))

这会纠正你的错误。请注意,我使用的是sys.stdout.buffer.write而不是print,因为buffer.write可以处理原始字节( UTF-8是原始字节数组,而不是字符串)。

此外,您还应该告诉客户端(浏览器),数据被用作utf-8 (否则浏览器也必须猜测,这可能成功,但最好是显式的)。

代码语言:javascript
复制
print("Content-Type: text/html; charset=utf-8\n")
票数 1
EN

Stack Overflow用户

发布于 2020-09-23 07:06:02

读取文件时,请使用上下文管理器。

后台的场景打开和关闭文件是为你做的,所以你不需要记住它。

代码语言:javascript
复制
with open(filename , encoding='utf-8') as f:
    text = f.read()
print(text)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64022468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档