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



感觉就像是一个非常基本的问题,我已经阅读了文档和答案,这表明我的代码应该正常工作。这可能确实是一个重复的东西,我错过了一些东西,请放下一个链接,因为我已经花了几个小时了,而且感觉很愚蠢。先感谢您。

Python 3.6代码:

import json
print( json.loads( '{"text": "\u0444\u044b\u0432\u0430"}' ) )

产生以下错误:

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)

我的印象是我可以做

jsn = json.dumps( my_dict )
# and later call
json.loads( jsn )

我会收回我的原始命令,但这对Unicode字符不起作用。

我可以将包含Unicode字符的字符串转换回带有JSON.LOADS的python dict吗?请为我的示例提供最低工作代码。

问题不是您的代码,而是您的stdout的编码设置。

原因与以下代码相同:

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

print使用stdout进行默认输出,因此您的stdout的编码设置不是" UTF-8"。要检查编码设置,请键入以下代码

import sys; print(sys.stdout)

您会得到这样的东西:

<_io.TextIOWrapper name='' mode='w' encoding='ANSI_X3.4-1968'>

编码的内容不是utf-8;要更改此操作,请使用utf-8编码重新打开stdout

import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="UTF-8")

现在print应该起作用。

但是,解决此问题的更深层解决方案是纠正系统的环境设置。

我有一个针对Linux的解决方案。在您的终端中键入locale -a,将列出当前系统的语言设置,让我们选择" UTF-8"编码语言。

export LANG=en_US.UTF-8 # for english user

export LANG=zh_CN.UTF-8 # 给中文用户

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

问题在于您的sys.stdout流编码,而不是json.loads()-您的代码片段适合我(使用Python 3.6.6和正确配置的Env)。FWIW您可以通过从json.loads()分开print()来自己发现。

tl; dr:检查您的OS DOC,以了解如何正确设置Stdout编码。

相关内容

最新更新