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