感觉像是一个非常基本的问题,我已经阅读了文档和答案,这表明我的代码应该可以工作。这可能真的是重复的,我错过了一些东西,请删除链接,因为我已经在这上面花了几个小时,感觉很傻。先感谢您。
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;要改变这种状况,重新stdout与utf-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以确保它始终有效。
| 归档时间: |
|
| 查看次数: |
3100 次 |
| 最近记录: |