Python使用'ascii'编解码器进行解码,它应该使用'UTF-8'

时间:2016-05-11 12:06:08

标签: 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

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

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

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

1 个答案:

答案 0 :(得分:2)

语言环境取自上下文;在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?