Skip to main content
 首页 » 编程设计

python之json.load 在加载带有拉丁字符的文件时出错

2025年05月04日14grandyang

我正在做一个 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 将使您免去处理不同语言的名称(和其他文本)的许多其他麻烦。