python - 使用Python读取JSON时,'ascii'编解码器无法编码错误

标签 python json unicode encoding utf-8

还有人找不到正确的咒语来让 Python 打印 UTF-8 字符。

我有一个 JSON 文件。 JSON 文件包含字符串值。这些字符串值之一包含字符“à”。我有一个 Python 程序,它读取 JSON 文件并打印其中的一些字符串。有时,当程序尝试打印包含“à”的字符串时,我会收到错误

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 12: ordinal not in range(128)

这很难重现。有时,稍微不同的程序能够打印字符串“à”。仅包含此字符串的较小 JSON 文件不会出现该问题。如果我开始在代码周围散布 encode('utf-8')decode('utf-8') ,它会以不可预测的方式改变爆炸的结果。我无法创建显示此问题的最小代码片段和输入。

我像这样加载 JSON 文件。

with codecs.open(filename, 'r', 'utf-8') as f:
    j = json.load(f)

我会像这样拉出有问题的字符串。

s = j['key']

后来我做了一个包含 sprint 并看到了错误。

我很确定原始文件是 UTF-8 格式,因为在交互式命令行中

codecs.open(filename, 'r', 'utf-8').read()

返回一个字符串,但是

codecs.open(filename, 'r', 'ascii').read()

给出一个关于 ascii 编解码器无法解码某字节的错误。文件大小(以字节为单位)与 wc -c 返回的字符数相同,并且我没有看到任何其他看起来像非 ASCII 字符的内容,因此我怀疑问题完全在于这一个高位 ASCII“à”。

我没有在代码中对 str() 进行任何显式调用。

我已经经历过Python Unicode HOWTO多次。我知道我应该“三明治”unicode 处理。我想我正在这样做,但显然我仍然误解了一些东西。

我很困惑,因为如果我在 codecs.open 调用中指定“utf-8”,一切都应该以 UTF-8 格式进行。我不明白 ASCII 编解码器是如何仍然潜入的。

我做错了什么?我该如何调试这个?

<小时/>

编辑:使用io模块代替编解码器。结果相同。

<小时/>

编辑:我没有最小的示例,但至少我有一个最小的重现场景。

我正在打印一个从导致问题的 JSON 中的字符串派生的对象。所以下面给出了一个错误。

print(myobj)

(请注意,我正在使用 from __future__ import print_function 尽管这似乎没有什么区别。)

encode('utf-8') 放在对象的 __str__ 函数返回值的末尾并不能修复该错误。但是,将打印行更改为这样即可。

print("%s" % myobj)

这对我来说看起来不对。我希望这两个打印调用是等效的。

<小时/>

我可以通过执行 sys.setdefaultencoding hack 来完成这项工作:

import sys
reload(sys)
sys.setdefaultencoding("UTF-8")

但这显然是一个坏主意,可能会导致 Python 在其他方面出现故障。

正确的做法是什么?我试过了

env PYTHONIOENCODING=UTF-8 ./myscript.py

但这没有用。 (毫不奇怪,因为问题是默认编码,而不是 io 编码。)

最佳答案

当您直接写入文件或将 stdout 重定向到文件或管道时,默认编码为 ASCII,并且您必须在写入之前对 Unicode 字符串进行编码。使用打开的文件句柄,您可以设置编码以自动发生这种情况,但使用 print 时,您必须使用 encode() 方法。

print s.encode('utf-8')

建议使用较新的 io 模块代替 codecs,因为它具有改进的实现并且与 Py3.x open() 向前兼容.

关于python - 使用Python读取JSON时,'ascii'编解码器无法编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28398723/

相关文章:

c# - 在 Newtonsoft JSON.NET 模式中禁用空类型

json - [__NSCFArray objectForKey :]: unrecognized selector sent to instance

javascript - 重音字符(变音符号)的具体 JavaScript 正则表达式

python - 从 U+ unicode 字符串定义转换为真正的 unicode 字符

Python - 我可以在不打开文件的情况下将 UTF8 BOM 添加到文件吗?

Python Selenium 套接字错误 - [Errno 61] 连接被拒绝

php - 将 .csv 读取到多维数组,然后将其传递给 JavaScript

python - Python中的继承,init方法重写

python - 使用 Dropbox Python API 确定文件夹或文件

python - 关于 python 类 __init__ 和装饰器