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}\nRun Code Online (Sandbox Code Playgroud)\n\nPython代码:
\n\nimport json\nimport os\n\nfileLoc=os.path.join(os.getcwd(),"appconfig.json")\njson_data=open(fileLoc).read()\nprint(json_data)\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n
尽量避免隐式编码和解码。
\n\n当您用于open()读取(或写入)文本文件(例如 JSON,但与 XML 不同)时,文件内容将使用某种默认编码进行解码。\n使用哪种默认编码取决于您的环境;你可以用 看到这个locale.getpreferredencoding()。
因此,假设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'\nRun Code Online (Sandbox Code Playgroud)\n\n如果是这种情况,那么很容易修复:指定编码open():
with open(fileLoc, 'r', encoding='utf8') as f:\n json_data = f.read()\nRun Code Online (Sandbox Code Playgroud)\n\n还有另一种可能(但不太可能)的解释:也许默认编码已经是 UTF-8,因此从文件读取数据时可以正确解码。\nprint()然后表达式再次使用 UTF-8 对数据进行编码,从而发送序列字节到 STDOUT,这与文件内容完全相同。\n但是,您的终端(或用于执行脚本的任何设备)将输出误解为 Latin-1,从而使它们显示为乱码。
如果是后者,那么您需要修复终端配置(以接受 UTF-8),或重新编码sys.stdout(使用sys.stdout = codecs.getwriter('latin-1')(sys.stdout),但我不建议这样做)。
| 归档时间: |
|
| 查看次数: |
4338 次 |
| 最近记录: |