OverflowError:编码字符串时不支持的UTF-8序列长度

7 投票
2 回答
19990 浏览
提问于 2025-04-17 07:55

在一个Twisted资源里面,我把一个经过json编码的字典作为下面的响应变量返回。这个数据是一个包含5个人的信息的列表,每个人都有名字、唯一标识符(guid)和几个其他字段,每个字段的长度都不超过32个字符,所以数据量不大。

我经常遇到这个OverflowError异常,但我不太明白“unsupported utf-8 sequence length”指的是什么。

self.request.write(ujson.dumps(response))

exceptions.OverflowError: 编码字符串时不支持的UTF-8序列长度

2 个回答

18

我最近遇到了同样的错误,想分享一下我的经验。

如果你看到这个错误,可能是因为你在用 Python 的 ujson 库对 MongoDB 的对象进行 json 编码。

如果用 Python 自带的库,就能得到更清晰的错误信息:

TypeError: ObjectId('510652d322fc956ca9e41342') is not JSON serializable

ujson 在处理一个 ObjectId 对象时出现了问题,搞得一头雾水。解决这个问题有几种方法,最简单的就是在保存之前把 MongoDB 中的 '_id' 字段去掉。你也可以通过创建一个 ujson 的子类,来处理或转换 ObjectId,使其变成简单的字符串。

3

有疑问的时候,去查看源代码:http://code.google.com/p/rapidjson/source/browse/trunk/thirdparty/ultrajson/ultrajsonenc.c

这个错误发生在UTF-8的长度是5或6个字节的时候。这个JSON的实现不支持这种情况。如果你在浏览器中使用这些数据,它们也不会正常工作,因为这些字符超出了UTF-16的范围。

我会很惊讶如果这种情况经常发生;这种情况只会出现在Unicode代码点超过U+1FFFFF的字符上,而这样的字符非常罕见。大多数Python版本也不支持这些字符,因为它们超出了这个范围。你应该查清楚为什么这些字符会出现在你的数据中。

撰写回答