使用 json 加载会在 Python 3.6 中产生“ascii 编解码器无法编码字符”错误

sr9*_*yar 1 python python-3.x

感觉像是一个非常基本的问题,我已经阅读了文档和答案,这表明我的代码应该可以工作。这可能真的是重复的,我错过了一些东西,请删除链接,因为我已经在这上面花了几个小时,感觉很傻。先感谢您。

Python 3.6 代码:

import json
print( json.loads( '{"text": \"\\u0444\\u044b\\u0432\\u0430\"}' ) )
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

Traceback (most recent call last):
  File "test2.py", line 28, in <module>
    print( json.loads( '{"txt": \"\\u0444\\u044b\\u0432\\u0430\"}' ) )
UnicodeEncodeError: 'ascii' codec can't encode characters in position 9-12: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

我有一个印象,我可以做到

jsn = json.dumps( my_dict )
# and later call
json.loads( jsn )
Run Code Online (Sandbox Code Playgroud)

我会找回我原来的字典,但这不适用于 unicode 字符。

我可以使用 json.loads 将包含 unicode 字符的字符串转换回 python dict 吗?请为我的示例提供最低工作代码。

小智 5

问题不在于您的代码,而在于您的stdout.

原因与以下代码相同:

import json
print(str(json.loads( '{"text": \"\\u0444\\u044b\\u0432\\u0430\"}' )).encode('ascii'))
Run Code Online (Sandbox Code Playgroud)

print使用stdout默认输出,让您的编码设置stdout不是“utf-8”。要检查编码设置,请键入以下代码

import sys; print(sys.stdout)
Run Code Online (Sandbox Code Playgroud)

你会得到这样的东西:

<_io.TextIOWrapper name='' mode='w' encoding='ANSI_X3.4-1968'>
Run Code Online (Sandbox Code Playgroud)

编码的内容不是utf-8;要改变这种状况,重新stdoututf-8编码。

import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="UTF-8")
Run Code Online (Sandbox Code Playgroud)

现在print应该工作。

但是这个问题更深层次的解决方案是更正你系统的环境设置。

我有一个适用于 linux 的解决方案。输入locale -a您的终端,当前系统的语言设置将陆续上市,让我们选择“UTF-8”编码的语言。

export LANG=en_US.UTF-8 # for english user
Run Code Online (Sandbox Code Playgroud)

或者

export LANG=zh_CN.UTF-8 # ?????
Run Code Online (Sandbox Code Playgroud)

您可能需要将其添加到其中.bashrc以确保它始终有效。