Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
';ascii';编解码器可以';使用Python读取JSON时出现t编码错误_Python_Json_Unicode_Encoding_Utf 8 - Fatal编程技术网

';ascii';编解码器可以';使用Python读取JSON时出现t编码错误

';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) 这很难复制。

还有一个人无法找到正确的魔法咒语来让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)
这很难复制。有时,一个稍微不同的程序能够打印字符串“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.x
open()

什么是
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