【问题标题】:Python uses 'ascii' codec in decoding where it should use 'UTF-8'Python在解码时使用'ascii'编解码器,它应该使用'UTF-8'
【发布时间】:2016-05-11 12:06:08
【问题描述】:

我有一段代码:

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

我得到一个:UnicodeDecodeError : 'ascii' codec can't decode byte 0xc4 in position 5595: ordinal not in range(128) on line 2

问题是根据 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”编解码器失败?

【问题讨论】:

  • 区域设置取决于您运行脚本的上下文。在相同的上下文中运行locale.getpreferredencoding(False) 命令。
  • UTF-8 首选编码是否在相同代码的同一运行中给出(例如,您在 with open(...) as textfile 正上方添加了 print(locale.getpreferredencoding(False)) 或通过其他方式?
  • 为什么不简单地将encoding 参数设置为open() 调用?
  • @MartijnPieters,我可以将编码传递给 open() 调用,我有,这只是出于好奇。在生产服务器上我遇到了这个问题。
  • @ChintanShah:您的生产代码可能使用相同的用户,但这并不意味着该代码使用相同的语言环境。如果您在 POSIX 系统(Mac、Linux 等)上运行它,则编码取自 LC_CTYPE 环境变量,如果未明确设置,则从 LC_ALLLANG 派生。因此,如果您的生产代码使用LANG=CLC_ALL=C 运行,则使用使用ASCII 作为编码的默认C 语言环境。

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


【解决方案1】:

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

【讨论】:

  • 知道从LC_ALL=en_US.utf8 python -c 'import locale; print locale.getpreferredencoding(False)' 获得ANSI_X3.4-1968locale -a 返回(其他结果数量)en_US.utf8 的原因可能是什么吗?
  • @PiotrDobrogost:这也取决于您的操作系统。我还发现不同的 Python 版本在拼写上有困难;在 Python 3.6 上,使用 UTF-8 有效(所以 LC_ALL=en_US.UTF-8)。我现在正在对此进行更多研究,但它在我的 Mac 上的运行方式也不像我预期的那样。
猜你喜欢
  • 2014-01-24
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 2020-07-17
  • 2018-05-05
  • 1970-01-01
相关资源
最近更新 更多