我正在做一个 python 项目,我对整个 utf-8/latin-1 编码/解码主题感到非常困惑。
我的 linux 系统是一个 Openshift 免费帐户。
我正在尝试加载一个包含 json 数据对象的文件。该对象有一个包含拉丁字符的条目。
测试.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 输出仍然导致错误。
我什至从这个 SO 问题中剪切并粘贴了 test.json 文件来运行我的测试,使其与其他人在同一页面上运行。
更新 2
如果我将 test.json 文件转换为“Windows-1252”格式,则 Windows 输出是正确的。 linux 框仍然导致相同的错误。我不确定为什么 Windows 框在文件转换为 utf-8 后不起作用。
请您参考如下方法:
在 Python 3 中,字符编码/解码由文件对象本身处理。在 open() 调用中指定编码:
import json
with open("test.json", encoding='utf-8') as data_file:
data = json.load(data_file)
print(data['name'])
它将在两个平台上正确加载文件,如果文件被正确编码为 UTF-8。
它绝对不会引发您显示的 UnicodeDecodeError 错误,因为它没有使用 ascii 编解码器。
如果您输出到控制台的代码页必须包含您正在打印的所有字符,否则 print() 将引发 UnicodeEncodeError 错误。
我建议您不要退回到ISO 8859-1 编解码器。这些编解码器应被视为互联网上的遗留编解码器。坚持使用 UTF-8 将使您免去处理不同语言的名称(和其他文本)的许多其他麻烦。
