【问题标题】:json.dump - UnicodeDecodeError: 'utf8' codec can't decode byte 0xbf in position 0: invalid start bytejson.dump - UnicodeDecodeError: 'utf8' codec can't decode byte 0xbf in position 0: invalid start byte
【发布时间】:2014-09-27 03:28:20
【问题描述】:

我有一本字典 data 我已经存储了:

  • key - 事件 ID

  • value - 此事件的名称,其中 value 是一个 UTF-8 字符串

现在,我想把这张地图写成一个 json 文件。我试过这个:

with open('events_map.json', 'w') as out_file:
    json.dump(data, out_file, indent = 4)

但这给了我错误:

UnicodeDecodeError:“utf8”编解码器无法解码位置 0 中的字节 0xbf: 无效的起始字节

现在,我也尝试了:

with io.open('events_map.json', 'w', encoding='utf-8') as out_file:
   out_file.write(unicode(json.dumps(data, encoding="utf-8")))

但这会引发同样的错误:

UnicodeDecodeError:“utf8”编解码器无法解码位置 0 中的字节 0xbf: 无效的起始字节

我也试过了:

with io.open('events_map.json', 'w', encoding='utf-8') as out_file:
    out_file.write(unicode(json.dumps(data, encoding="utf-8", ensure_ascii=False)))

但这会引发错误:

UnicodeDecodeError:“ascii”编解码器无法解码位置 3114 中的字节 0xbf:序数不在范围内 (128)

关于如何解决这个问题的任何建议?

编辑: 我相信这是导致我问题的原因:

> data['142']
'\xbf/ANCT25'

编辑 2: data 变量是从文件中读取的。因此,从文件中读取后:

data_file_lines = io.open(file_name, 'r', encoding='utf8').readlines()

然后我会这样做:

with io.open('data/events_map.json', 'w', encoding='utf8') as json_file:
        json.dump(data, json_file, ensure_ascii=False)

这给了我错误:

TypeError: 必须是 unicode,而不是 str

然后,我尝试使用数据字典执行此操作:

for tuple in sorted_tuples (the `data` variable is initialized by a tuple):
    data[str(tuple[1])] = json.dumps(tuple[0], ensure_ascii=False, encoding='utf8')

这又是:

with io.open('data/events_map.json', 'w', encoding='utf8') as json_file:
    json.dump(data, json_file, ensure_ascii=False)

但同样的错误:

TypeError: must be unicode, not str

当我使用简单的open 函数从文件中读取时,我得到了同样的错误:

data_file_lines = open(file_name, "r").readlines()

【问题讨论】:

  • data 字典中的字符串实际上不是 UTF-8 编码的;将其解码为 Unicode 失败。
  • 您能否将实际的data 字典放入您的帖子中?只需包含print data 的输出即可。
  • data 变量太大,无法粘贴。无论如何,我认为我的字典中只有一个条目导致了这个问题。我编辑了我的帖子。
  • 该字符串确实是不是 UTF-8 编码的。那应该是inverted question mark 吧?
  • 您必须将该值替换为实际的 UTF-8 编码值,或者将其替换为 Unicode 值(因此在将其传递给 json.dump() 之前先明确解码)。跨度>

标签: python json unicode encoding utf-8


【解决方案1】:

异常是由您的data 字典的内容引起的,至少一个键或值是不是 UTF-8 编码的。

你必须替换这个值;通过替换一个 UTF-8 编码的值,或者通过使用任何编码对该值的正确编码仅解码该值将其解码为 unicode 对象:

data['142'] = data['142'].decode('latin-1')

将该字符串解码为 Latin-1 编码的值。

【讨论】:

  • 我从文件中读取这些值。您对倒置问号是正确的,所以我用另一个 UTF-8 字符(字母“é”)更改了该值。使用您的解决方案data['142'].decode('latin-1') 它不会引发任何错误,但在最终的 json 文件中我有“142”:“\u00e9ANCT25”,而不是预期的:“142”:“éANCT25”。我尝试使用 codecs.open(file_name, "r", "utf-8") 读取文件,但在这里我有:UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 2526468: invalid continuation byte。我该如何解决这个问题。所以真正的字符是写在json里的?
  • \u00e9 是一个有效的 JSON 转义序列;您是否绝对必须使用 Unicode 字符而不是 JSON \uxxxx 转义序列?
  • @Belphegor:请参阅Saving utf-8 texts in json.dumps as UTF8, not as \u escape sequence 了解如何生成此类数据。
  • 感谢您的帮助,但这对我没有帮助。它仍然不起作用。我编辑了我的问题,描述了我尝试过的其他内容(在“编辑 2”中)。还有其他建议吗?
  • 没关系,我终于解决了!我从这里得到了答案:stackoverflow.com/questions/12309269/…(Python 2.x 的代码)。无论如何,@Martijn Pieters,没有你我不会这样做,所以我接受你的回答。但是,请从我在您的答案中提供的链接中添加答案,这样如果其他人遇到同样的问题会更清楚。干杯!
猜你喜欢
  • 1970-01-01
  • 2018-07-11
  • 2014-05-14
  • 2022-09-26
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
相关资源
最近更新 更多