Python3 utf-8解码问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python3 utf-8解码问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1620字,纯文字阅读大概需要3分钟。
内容图文
![Python3 utf-8解码问题](/upload/InfoBanner/zyjiaocheng/728/cb970fa148c442b99c473c69582ac991.jpg)
以下代码在我的Windows机器上使用Python3运行正常并打印字符’é’:
data = b"\xc3\xa9"
print(data.decode('utf-8'))
但是,在基于Ubuntu的docker容器上运行相同会导致:
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 0: ordinal not in range(128)
有什么必须安装才能启用utf-8解码吗?
解决方法:
问题在于print()表达式,而不是decode()方法.
如果仔细观察,引发的异常是UnicodeEncodeError,而不是-DecodeError.
每当你使用print()函数时,Python都会将其参数转换为str,然后将结果编码为字节,这些字节将被发送到终端(或运行的任何Python).
用于编码的编解码器(例如UTF-8或ASCII)取决于环境.
在一个理想的情况下,
> Python使用的编解码器与终端所期望的编解码器兼容,因此字符显示正确(否则你会得到像“é”而不是“é”的mojibake);
>使用的编解码器涵盖了足以满足您需求的一系列字符(例如UTF-8或UTF-16,它们包含所有字符).
在您的情况下,您提到的Linux docker不符合第二个条件:使用的编码是ASCII,它只支持旧英文打字机上的字符.
这些是解决此问题的几个选项:
>设置环境变量:在Linux上,Python的编码默认值取决于此(至少部分).根据我的经验,这是一个试验和错误;将LC_ALL设置为包含“UTF-8”的东西曾经为我工作过一次.您必须将它们放在终端运行的shell的启动脚本中,例如. .bashrc中.
>重新编码STDOUT,如下所示:
sys.stdout = open(sys.stdout.buffer.fileno(), 'w', encoding='utf8')
使用的编码必须匹配终端之一.
>自己编码字符串并将它们发送到sys.stdout底层的二进制缓冲区,例如. sys.stdout.buffer.write( “E” .encode( ‘UTF8’)).这当然是比印刷品(“é”)更多的样板.同样,使用的编码必须匹配终端之一.
>完全避免打印().使用open(fn,encoding = …)作为输出,进度信息的日志记录模块 – 取决于脚本的交互方式,这可能是值得的(诚然,在写入STDERR时可能会遇到相同的编码问题)记录模块).
可能还有其他选择,但我怀疑有更好的选择.
内容总结
以上是互联网集市为您收集整理的Python3 utf-8解码问题全部内容,希望文章能够帮你解决Python3 utf-8解码问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。