2016-08-24 117 views
1

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

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)

我使用的是完全相同的数据文件执行完全相同的代码。该复制问题的一个样本数据文件是这样的:

¥ Α © § 

我叫这个sample.txt

一个非常简单的Python脚本只是简单的阅读和打印文件的内容:

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

print("Done") 

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

回答

1

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

In text mode, if encoding is not specified the encoding used is platform dependent: locale.getpreferredencoding(False) is called to get the current locale encoding. [Link]

平台相关建议的环境变量。所以,我检查了我的外壳设置了什么环境变量,并发现LANG设置为en_US.UTF-8。转储由Apache设置的环境变量发现LANG丢失。

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

为了解决这个问题,我在我的CGI脚本中设置了这个环境变量。

export LANG=en_US.UTF-8 

或者任何优选编码期望:如果环境变量以某种方式从用户壳缺失,可以通过普通的方法仅通过设定,或者。

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