簡體   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