+-
Python3 utf-8解码问题
以下代码在我的 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解码问题 - 乐贴网