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

Rin*_*ntG 5 unicode json character-encoding python-3.x

我正在尝试使用附加的 Python 代码(Python V3.5.1)读取下面的 json 数据,但问题表示 \xc3\xa7 为 \xc3\x83\xc2\xa7 和 \xc2\xa3 为 \xc3\x82\ xc2\xa3。\n请帮助我编写可以正确读取文件数据和从文件写入数据的代码,而无需更改格式或字符集

\n\n

杰森数据:

\n\n
{\n    "config":[{\n            "filetype": ".csv",\n            "coldelimiter":"\xc3\xa7",\n            "rowdelimiter":"\xc2\xa3"\n    }]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Python代码:

\n\n
import json\nimport os\n\nfileLoc=os.path.join(os.getcwd(),"appconfig.json")\njson_data=open(fileLoc).read()\nprint(json_data)\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
{\n    "config":[{\n            "filetype": ".csv",\n            "coldelimiter":"\xc3\x83\xc2\xa7",\n            "rowdelimiter":"\xc3\x82\xc2\xa3"\n    }]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

len*_*enz 3

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

\n\n

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

\n\n

因此,假设appconfig.json使用 UTF-8 存储在磁盘上,但您的区域设置配置为使用 Latin-1,那么字母\xc3\xa7将被误解为序列\xc3\x83\xc2\xa7。确认:

\n\n
>>> '\xc3\xa7'.encode('utf8').decode('latin1')\n'\xc3\x83\xc2\xa7'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
with open(fileLoc, 'r', encoding='utf8') as f:\n    json_data = f.read()\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

如果是后者,那么您需要修复终端配置(以接受 UTF-8),或重新编码sys.stdout(使用sys.stdout = codecs.getwriter('latin-1')(sys.stdout),但我不建议这样做)。

\n