Unicode文件读取时的UnicodeDecodeError

时间:2016-08-24 18:21:47

标签: python linux python-3.x unicode cgi

我有一个问题,当我执行一个涉及从包含unicode代码点的文件中读取数据的脚本时,一切正常。但是当它通过另一个应用程序执行时,它会引发以下错误:

  

UnicodeDecodeError:' ascii'编解码器不能将字节0xc2解码到位   0:序数不在范围内(128)

我使用完全相同的数据文件执行完全相同的代码。复制问题的示例数据文件如下所示:

¥ Α © §

我打电话给sample.txt

一个非常简单的python脚本,可以简单地读入并打印文件内容:

with open("sample.txt") as f:
    for line in f:
        print(line)

print("Done")

从命令行执行此操作;通过Apache / CGI执行失败,出现上述错误。

1 个答案:

答案 0 :(得分:1)

问题的提示来自open函数的文档:

  

在文本模式下,如果未指定编码,则使用的编码为   依赖于平台:调用locale.getpreferredencoding(False)   获取当前的语言环境编码。   [Link]

平台相关的建议环境变量。因此,我检查了为shell设置的环境变量,并将LANG设置为en_US.UTF-8。转储由Apache设置的环境变量,发现LANG丢失了。

因此,显然当无法确定区域设置时,Python使用ASCII作为默认文件编码。结果,当序数超出ASCII范围时遇到错误。

要解决此问题,我在CGI脚本中设置了此环境变量。如果环境变量以某种方式从用户shell中丢失,则可以通过常规方法设置,或者仅通过:

设置
export LANG=en_US.UTF-8

或者需要任何首选编码。

请注意,如果用户shell中缺少区域设置,则问题可能会更加明显,因为像vi这样的文本编辑器在没有它的情况下不会显示字符。当从Apache(或其他一些应用程序)调用时只有一个问题,它显得更加微妙。