Python3 UTF-8解码问题

用户3923073

以下代码在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()方法。如果你仔细一看,出现的异常是UnicodecodeError,而不是一个-codeError。

每当您使用该print()函数时,Python都会将其参数转换为a str,然后将结果编码,然后将bytes其发送到终端(或运行其中的任何Python)。用于编码的编解码器(例如UTF-8或ASCII)取决于环境。在理想情况下,

  • Python使用的编解码器与终端所期望的编解码器兼容,因此字符可以正确显示(否则,您会收到像“é”而不是“é”之类的mojibake);
  • 使用的编解码器涵盖了足以满足您需求的一系列字符(例如UTF-8或UTF-16,其中包含所有字符)。

在您的情况下,您提到的Linux泊坞窗不满足第二个条件:所使用的编码为ASCII,仅支持在老式英文打字机上找到的字符。这些是解决此问题的一些选择:

  • 设置环境变量:在Linux上,Python的默认编码取决于此(至少部分地)。以我的经验,这是一个反复试验的过程。设置LC_ALL为包含“ UTF-8”的内容对我来说一次。您必须将它们放在启动脚本中,以便终端运行外壳程序,例如。.bashrc
  • 重新编码STDOUT,如下所示:

    sys.stdout = open(sys.stdout.buffer.fileno(), 'w', encoding='utf8')
    

    所使用的编码必须匹配终端之一。

  • 自己对字符串进行编码,然后将其发送到底层的二进制缓冲区sys.stdout,例如。sys.stdout.buffer.write("é".encode('utf8'))当然,这比起更多的样板print("é")同样,所使用的编码必须匹配终端之一。
  • print()完全避免使用open(fn, encoding=...)输出,进步信息记录模块-这取决于你的脚本是如何互动的,这可能是值得的(当然,与记录模块写入STDERR的时候你可能会面临同样的编码问题)。

可能还有其他选择,但我怀疑还有更好的选择。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章