以下代码在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()
方法。如果你仔细一看,出现的异常是Unicode恩codeError,而不是一个-德codeError。
每当您使用该print()
函数时,Python都会将其参数转换为a str
,然后将结果编码为,然后将bytes
其发送到终端(或运行其中的任何Python)。用于编码的编解码器(例如UTF-8或ASCII)取决于环境。在理想情况下,
在您的情况下,您提到的Linux泊坞窗不满足第二个条件:所使用的编码为ASCII,仅支持在老式英文打字机上找到的字符。这些是解决此问题的一些选择:
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] 删除。
我来说两句