Python 在应该使用 'ascii' 的地方解码时使用 'UTF-8' 编解码器

标签 python python-3.x encoding utf-8 python-3.4

我有一段代码:

with open('filename.txt','r') as textfile:
    kwList = [x.strip('\n') for x in textfile.readlines()]

我得到一个:UnicodeDecodeError:“ascii”编解码器无法解码位置 5595 中的字节 0xc4:第 2 行的序数不在范围(128)内

问题是根据 python 文档: https://docs.python.org/3/library/functions.html#open

当 open 方法中没有指定编码时,Python3 使用 locale.getpreferredencoding(False) 来获取要使用的默认编码。

当我运行 locale.getpreferredencoding(False) 时,我得到“UTF-8”。

当 Python 应使用“utf-8”来执行此操作时,为什么我会在 UnicodeDecodeError 中收到“ascii”编解码器失败?

最佳答案

区域设置取自上下文;在 POSIX 系统上,这意味着环境变量,请参阅 POSIX locale documentation 。如果您想测试 Python 将决定哪种编码(例如,也复制生产环境使用的环境变量),您需要重现生产环境的确切上下文。

您可能将程序作为仅设置(或继承)有效用户的子进程运行,但不复制该用户的环境。该父进程已设置显式语言环境,或者如果未设置,则使用默认的 C 语言环境。该区域设置的默认编码是 ASCII;有些系统会以 ANSI_X3.4-1968 名称报告此情况:

$ LANG=C python -c 'import locale; print(locale.getpreferredencoding(False))'
ANSI_X3.4-1968

例如,如果您的生产代码是从 cron 运行的,那么当您设置特定用户时,不会设置环境变量。在 crontab 顶部显式设置 LC_ALL 环境变量:

LC_ALL=en.UTF-8

如果您的 cron 实现支持以这种方式设置变量,或者在您要运行的命令行上设置它:

* * * * *    LC_ALL=nb_NO.UTF-8 /path/to/your/program

参见Where can I set environment variables that crontab will use?

关于Python 在应该使用 'ascii' 的地方解码时使用 'UTF-8' 编解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37162181/

相关文章:

python - 在Python中对加速度计数据随时间的变化进行分类

python - 列表最小值与常量

python - 阴谋地徘徊

python - 如何使用递归计算嵌套列表的最大长度?

javascript - 快速 : What Format is the Date in this JSON file

python - 递归如何找到最大值?

python - 通过 Python 从二进制文件访问 ctypes **argv

python-3.x - 无法将一个文件导入到另一个文件中

JavaScript - 整数的负字节

cocoa-touch - NSString 方法对 URL '&' 进行百分比转义