【问题标题】:json encoding isn't considering encoding argument in pythonjson编码没有考虑python中的编码参数
【发布时间】:2018-04-28 23:36:37
【问题描述】:

尝试使用 utf 目录 (utf-8-sig) 使用此代码对 json 文件进行编码

data =json.load(open("data.json", encoding = "utf-8-sig"))

但似乎编码参数被忽略并抛出此错误

    Traceback (most recent call last):
  File "app1.py", line 11, in <module>
    print(k,v)
UnicodeEncodeError: 'ascii' codec can't encode character '\xb0' in position 141: ordinal not in
range(128)

编辑:文件 data.json 的数据类型是&lt;class '_io.TextIOWrapper'&gt;,这是完整的堆栈:

import json
data =json.load(open("data.json", encoding = "utf-8-sig"))
for k,v in data.items():
    print(k,v)

Edit2:使用print(open("data.json"), "rb").read(180)的文件的二进制样本

b'{"废弃工业用地": ["不能用于任何 目的,被污染物污染。”],“废弃车辆”: [“一辆在环境中被丢弃的车辆”

【问题讨论】:

  • 你确定这是失败的路线吗?你能发布完整的堆栈跟踪吗?
  • @tdelaney,刚刚发布了我打开“data.json”时的完整堆栈和数据类型
  • 尝试仅测试读取:tmp = open("data.json", encoding = "utf-8-sig").read(256)。发布文件的二进制样本也很有趣(可能是print(open("data.json"), "rb").read(180)
  • 如果问题是加载数据,那将是decode 错误。 sys.stdout.encoding 是什么?只是想弄清楚编码(而不是解码)发生在哪里以及为什么它是 ascii。
  • 那是你的问题。您不能在 ascii 终端上打印非 ascii 数据。您可以自己解码并替换吗?对于未知字符。

标签: python json python-3.x encoding


【解决方案1】:

正如@tdelaney 在 cmets 中指出的那样,您正在寻找错误的问题:

错误不在open,也不在json.read,不在data.items()迭代器中,所以不是解码问题,在utf-8-sig和unicode字符串之间。

但问题出在print。问题是encoding,所以这意味着python中的unicode字符串和产生的binary编码之间的错误。在这种情况下,unicode字符串被转换成ascii,但是ascii不能代表所有的原始字符。

有两种解决方案:

  • 您可以允许您的终端接受 UTF-8 字符。这可以通过设置来完成,例如LANG=C.UTF-8(仅在少数系统上支持)或 LANG=en_US.UTF-8 或其他语言环境(检查您的系统哪些语言环境支持 UTF-8)。

  • 您强制 print 仅打印 ascii,正如 @tdelaney print(k.encode('ascii', 'replace'), v.encode('ascii', 'replace')) 所建议的那样。您可能希望将replace 更改为backslashreplaceignore。 (见https://docs.python.org/3/library/codecs.html#codec-base-classes)。

还有混合解决方案(但并非在所有系统上都真正安全和可移植)(例如强制 python 以特定编码输出)和许多 hack,但它会使您的代码复杂,所以我不推荐它(并且您应该将它们包装在一个新函数中)。

【讨论】:

    猜你喜欢
    • 2015-09-18
    • 1970-01-01
    • 2020-05-03
    • 2017-03-23
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2021-04-18
    • 2016-07-09
    相关资源
    最近更新 更多