我有一个问题,当我执行一个涉及从包含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执行失败,出现上述错误。
答案 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(或其他一些应用程序)调用时只有一个问题,它显得更加微妙。