繁体   English   中英

加载带有拉丁字符的文件时,json.load提供错误

[英]json.load gives error when loading a file with latin character

我正在研究一个python项目,我对整个utf-8 / latin-1编码/解码主题感到非常困惑。

我的Linux系统是一个Openshift免费帐户。

我正在尝试加载包含json数据对象的文件。 该对象具有一个包含拉丁字符的条目。

test.json:

 {
 "name" : "Corazón"
 }

当我在Windows系统上加载它时,没有收到错误,但是json.load之后的结果是:

Windows输出:

Corazón

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编解码器。 这些编解码器应被视为Internet上的旧编解码器。 坚持使用UTF-8可以避免使用其他语言处理名称(和其他文本)时遇到的其他麻烦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM