使用Python从Json文件读取和写入Unicode字符

时间:2017-04-12 07:11:21

标签: json python-3.x unicode character-encoding

我正在尝试使用附加的Python代码(Python V3.5.1)阅读下面的json数据,但问题 字符表示ç为Ã和£为££。 请帮助我使用能够正确读取和写入文件数据的代码,而无需更改格式或字符集

Json数据:

{
    "config":[{
            "filetype": ".csv",
            "coldelimiter":"ç",
            "rowdelimiter":"£"
    }]
}

Python代码:

import json
import os

fileLoc=os.path.join(os.getcwd(),"appconfig.json")
json_data=open(fileLoc).read()
print(json_data)

输出:

{
    "config":[{
            "filetype": ".csv",
            "coldelimiter":"ç",
            "rowdelimiter":"£"
    }]
}

1 个答案:

答案 0 :(得分:0)

尽量避免隐式编码和解码。

当您使用open()读取(或写入)文本文件(例如JSON,但与XML不同)时,文件内容将使用某些默认编码进行解码。 使用哪种默认编码取决于您的环境;你可以用locale.getpreferredencoding()看到这个。

因此,我们假设 appconfig.json 存储在具有UTF-8的磁盘上,但您的语言环境配置为使用Latin-1,那么字母ç将是被误解为序列ç。确认:

>>> 'ç'.encode('utf8').decode('latin1')
'ç'

如果是这种情况,那么很容易修复:在open()上指定编码:

with open(fileLoc, 'r', encoding='utf8') as f:
    json_data = f.read()

还有另一种可能(但不太可能)的解释:也许默认编码已经是UTF-8,因此从文件中读取时数据会被正确解码。 然后,print()表达式再次使用UTF-8对数据进行编码,从而向STDOUT发送一个字节序列,该序列与文件内容完全相同。 但是,您的终端(或用于执行脚本的任何内容)将输出误解为输出为Latin-1,这样它们就会显示为乱码。

如果是后者,则需要修复终端配置(接受UTF-8),或重新编码sys.stdoutsys.stdout = codecs.getwriter('latin-1')(sys.stdout),但我不建议)。