【发布时间】:2015-10-08 22:46:27
【问题描述】:
我正在做一个 python 项目,我对整个 utf-8/latin-1 编码/解码主题感到很困惑。
我的 linux 系统是一个 Openshift 免费帐户。
我正在尝试加载一个包含 json 数据对象的文件。该对象有一个包含拉丁字符的条目。
test.json:
{
"name" : "Corazón"
}
当我在我的 Windows 系统上加载它时,我没有收到错误,但是 json.load 之后的结果是:
Windows 输出:
科拉桑
Openshift Linux 系统回溯:
data = json.load(data_file, encoding='utf-8')
File "/opt/rh/python33/root/usr/lib64/python3.3/json/__init__.py", line 271, in load
return loads(fp.read(),
File "/opt/rh/python33/root/usr/lib64/python3.3/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 18: ordinal not in range(128)
我的代码是:
import json
with open("test.json") as data_file:
data = json.load(data_file, encoding='utf-8')
print(data['name'])
我尝试了不同的编码('utf-8'、'ascii'、'latin-1'),它们都给了我相同的结果。我显然在这里遗漏了一些东西。另外,如您所见,我从 windows 和 linux python 得到不同的结果。
我应该如何配置 json.load 以便它可以在 Windows 和 linux python 系统上正确加载文件?
更新 1
我进行了更多测试。 “test.json”文件是 utf-8 编码的,仍然给我上述结果。当我将文件编码为 ISO 8859-1 时,Windows 输出是正确的,但 linux out 仍然会导致错误。
我什至从这个 SO 问题中剪切并粘贴了 test.json 文件,以运行我的测试以与其他人在同一页面上。
更新 2
如果我将 test.json 文件转换为“Windows-1252”格式,则 Windows 输出是正确的。 linux盒子仍然会导致同样的错误。我不确定为什么文件被转换为 utf-8 时 windows 框不起作用。
【问题讨论】:
-
在我的 Linux 系统上使用此代码可以正常工作。也许尝试重写文件的那部分?
print data['name']给了我 Corazón -
我的生产开发系统是一个 Openshift 免费帐户。我想知道这是否与它有关?
-
为什么在我的 Windows 系统上还是不正确?
-
您是否使用 UTF-8 编码保存该 JSON 文件?您确定加载的对象是错误的,还是试图打印该对象?
-
查看我更新的问题以及其他答案中的 cmets。它现在可以在 Windows 上运行,但不能在 Openshift linux 上运行。
标签: python json encoding utf-8 openshift