加载带拉丁字符的文件时,json.load会出错

fat*_*sma 1 python encoding json utf-8 openshift

我正在开发一个python项目,我对这整个utf-8/latin-1编码/解码主题感到困惑.

我的linux系统是一个Openshift免费帐户.

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

test.json:

 {
 "name" : "Corazón"
 }
Run Code Online (Sandbox Code Playgroud)

当我在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)
Run Code Online (Sandbox Code Playgroud)

我的代码是:

import json

with open("test.json") as data_file:
    data = json.load(data_file, encoding='utf-8')

print(data['name'])
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的编码('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.

roe*_*and 7

在Python 3中,字符编码/解码由文件对象本身处理.在open()呼叫中指定编码:

import json
with open("test.json", encoding='utf-8') as data_file:                           
    data = json.load(data_file)

print(data['name'])
Run Code Online (Sandbox Code Playgroud)

如果文件正确编码为UTF-8 ,它将在两个平台上正确加载文件.

它绝对不会引发UnicodeDecodeError您显示的错误,因为它不使用ascii编解码器.

如果输出到控制台代码页必须包含您要打印的所有字符,否则print()将引发UnicodeEncodeError错误.

我建议你不要回到ISO 8859-1编解码器.这些编解码器应被视为互联网上的传统编解码器.坚持使用UTF-8将为您解决许多其他令人头痛的问题,处理不同语言的名称(和其他文本).