首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >json.dump - UnicodeDecodeError:'utf8‘编解码器无法解码0位置的字节0 0xbf :无效的开始字节

json.dump - UnicodeDecodeError:'utf8‘编解码器无法解码0位置的字节0 0xbf :无效的开始字节
EN

Stack Overflow用户
提问于 2014-08-04 15:34:17
回答 1查看 56.2K关注 0票数 13

我有一本字典data,存放在这里:

  • 事件的key - ID
  • value -这个事件的名称,其中value是一个UTF-8字符串。

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

代码语言:javascript
运行
复制
with open('events_map.json', 'w') as out_file:
    json.dump(data, out_file, indent = 4)

但这给了我一个错误:

UnicodeDecodeError:'utf8‘编解码器无法解码0位置的字节0 0xbf :无效的开始字节

现在,我还试着:

代码语言:javascript
运行
复制
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位置的字节0 0xbf :无效的开始字节

我也尝试过:

代码语言:javascript
运行
复制
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个)

关于如何解决这个问题,有什么建议吗?

编辑:--我相信这是引起我问题的那一行:

代码语言:javascript
运行
复制
> data['142']
'\xbf/ANCT25'

编辑2:从文件中读取data变量。因此,在从文件中读取它之后:

代码语言:javascript
运行
复制
data_file_lines = io.open(file_name, 'r', encoding='utf8').readlines()

然后我会:

代码语言:javascript
运行
复制
with io.open('data/events_map.json', 'w', encoding='utf8') as json_file:
        json.dump(data, json_file, ensure_ascii=False)

这给了我一个错误:

TypeError:必须是unicode,而不是str

然后,我尝试使用数据字典来实现这一点:

代码语言:javascript
运行
复制
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')

其次是:

代码语言:javascript
运行
复制
with io.open('data/events_map.json', 'w', encoding='utf8') as json_file:
    json.dump(data, json_file, ensure_ascii=False)

但是,同样的错误:

代码语言:javascript
运行
复制
TypeError: must be unicode, not str

当我使用简单的open函数从文件中读取时,也会出现同样的错误:

代码语言:javascript
运行
复制
data_file_lines = open(file_name, "r").readlines()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-04 16:00:04

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

您必须替换该值;要么替换一个编码为UTF-8的值,要么将其解码为unicode对象,只使用该值的任何编码对该值进行正确的编码:

代码语言:javascript
运行
复制
data['142'] = data['142'].decode('latin-1')

将该字符串解码为拉丁文1编码的值。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25122371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档