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

标签 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":"£"
    }]
}

最佳答案

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

当您使用 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.stdout (使用 sys.stdout = codecs.getwriter('latin-1')(sys.stdout) ,但我不建议这样做)。

关于json - 使用 Python 从 Json 文件中读取和写入 Unicode 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43362725/

相关文章:

android - if else 语句设置不同的listadaptor

android - 在Firebase-Realtime Database上使用什么规则让用户注册和登录?

python - 是否可以在数据类中使用 *args?

java - 为什么我的 Unicode 字符串在从 Java Applet 传递到 Java Script 时会损坏?

c# - 使用 Json.NET 从 WebService 反序列化大型 json

Javascript Lossy PNG图像压缩库

python - 为什么 python 在 `pass` 之后继续评估代码?

python - 为什么我的 python 打印比 Go 的 fmt.Print 和 os.Stdout.Write 运行得更快

haskell - 哪个 KeyBoard/KeyBoard Layout 最适合 Haskell 编程? haskell 是否将所有数学符号都作为函数?

ios - UILabel 仅支持某些 Unicode 字符