Python3 utf-8 解码问题

use*_*073 4 python linux windows utf-8 python-3.x

以下代码在我的 Windows 机器上使用 Python3 运行良好,并打印字符“é”:

data = b"\xc3\xa9"

print(data.decode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

但是,在基于 Ubuntu 的 docker 容器上运行相同的结果:

UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

是否需要安装任何东西才能启用 utf-8 解码?

pla*_*ker 5

似乎 ubuntu - 根据版本 - 使用一种或另一种编码作为默认编码,并且在 shell 和 python 之间也可能有所不同。从这篇文章这个博客中采用

因此,推荐的方法似乎是告诉您的 python 实例utf-8用作默认编码:

通过环境变量设置python源文件的默认编码:

export PYTHONIOENCODING=utf8
Run Code Online (Sandbox Code Playgroud)

此外,在您的源文件中,您可以明确说明您希望使用的编码,因此无论环境设置如何,它都应该可以工作(请参阅此问题 + 答案python 文档PEP 263

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
....
Run Code Online (Sandbox Code Playgroud)

关于python读取文件编码的解释,可以在open命令中明确指定

with open(fname, "rt", encoding="utf-8") as f:
    ...
Run Code Online (Sandbox Code Playgroud)

并且有一种带有一些副作用的更骇人听闻的方式,但可以节省您每次都明确指定它

import sys
# sys.setdefaultencoding() does not exist, here!
reload(sys)  # Reload does the trick!
sys.setdefaultencoding('UTF8')
Run Code Online (Sandbox Code Playgroud)

请阅读相关答案和评论中有关此黑客的警告。