';ascii';编解码器可以';使用Python读取JSON时出现t编码错误
还有一个人无法找到正确的魔法咒语来让Python打印UTF-8字符 我有一个JSON文件。JSON文件包含字符串值。其中一个字符串值包含字符“a”。我有一个Python程序,它读取JSON文件并打印其中的一些字符串。有时,当程序试图打印包含“a”的字符串时,我会得到错误';ascii';编解码器可以';使用Python读取JSON时出现t编码错误,python,json,unicode,encoding,utf-8,Python,Json,Unicode,Encoding,Utf 8,还有一个人无法找到正确的魔法咒语来让Python打印UTF-8字符 我有一个JSON文件。JSON文件包含字符串值。其中一个字符串值包含字符“a”。我有一个Python程序,它读取JSON文件并打印其中的一些字符串。有时,当程序试图打印包含“a”的字符串时,我会得到错误 UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 12: ordinal not in range(128) 这很难复制。
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 12: ordinal not in range(128)
这很难复制。有时,一个稍微不同的程序能够打印字符串“a”。仅包含此字符串的较小JSON文件不会出现问题。如果我开始在代码周围喷洒encode('utf-8')
和decode('utf-8')
,它会以不可预知的方式改变发生的事情。我还不能创建一个最小的代码片段和输入来显示这个问题
我像这样加载JSON文件
with codecs.open(filename, 'r', 'utf-8') as f:
j = json.load(f)
我会像这样拔出那根惹人生气的绳子
s = j['key']
后来我做了一个print
,其中包含s
,并查看错误
我很确定原始文件是UTF-8格式的,因为在交互式命令行中
codecs.open(filename, 'r', 'utf-8').read()
返回一个字符串,但是
codecs.open(filename, 'r', 'ascii').read()
给出一个关于ascii编解码器无法解码某个字节的错误。以字节为单位的文件大小与wc-c
返回的字符数相同,我没有看到任何其他看起来像非ASCII字符的字符,因此我怀疑问题完全在于这个高ASCII“a”
我没有在代码中显式调用str()
我已经经历过多次了。我知道我应该“三明治”处理。我想我是在这么做,但显然有些事情我还是误解了
大多数情况下,我感到困惑,因为如果我在编解码器中指定“utf-8”。打开调用,一切都应该在utf-8中发生。我不明白ASCII编解码器怎么还偷偷进来
我做错了什么?我如何调试这个
编辑:使用io
模块代替codec
。同样的结果
编辑:我没有一个最小的例子,但至少我有一个最小的复制场景
我正在打印一个从导致问题的JSON中的字符串派生的对象。下面给出了一个错误
print(myobj)
(请注意,我使用的是from\uuuuu future\uuuuu导入打印\u函数
,尽管这似乎没有什么区别。)
将encode('utf-8')
放在我的对象的\uuu str\uuu
函数返回值的末尾并不能修复该错误。但是,将打印行更改为该行会导致错误
print("%s" % myobj)
我觉得这是不对的。我希望这两个打印调用是等效的
我可以通过执行以下操作来完成此工作:
但这显然是一个坏主意,可能会使Python在其他方面出现故障
正确的方法是什么?我试过了
env PYTHONIOENCODING=UTF-8 ./myscript.py
但那没用。(毫不奇怪,因为问题是默认编码,而不是io编码。)当您直接写入文件或将标准输出重定向到文件或管道时,默认编码是ASCII,您必须在写入Unicode字符串之前对其进行编码。使用打开的文件句柄,您可以将编码设置为自动执行,但使用print
时,您必须使用encode()
方法
打印s.encode('utf-8')
建议使用较新的io
模块来代替编解码器
,因为它改进了实现,并且与Py3.xopen()
什么是print(repr(myobj))
?print(repr(myobj))不引发错误。它按预期打印repr字符串。(例如,转义“\n”而不是换行。)我问的是什么(导致问题的对象),而不是repr(myobj)
是否导致错误(不应该)。您是否使用自定义对象(自定义\uuuuuunicode\uuuuu
,\uuuu str\uuuu
)来解析json?为什么?您不应该在打印Unicode之前对其进行编码。不要在脚本中硬编码环境的字符编码。设置适当的区域设置(LANG、LC_CTYPE、LC_ALL)和/或pythonoencoding
envvar。
env PYTHONIOENCODING=UTF-8 ./myscript.py