OverflowError:编码字符串时不支持的UTF-8序列长度
在一个Twisted资源里面,我把一个经过json编码的字典作为下面的响应变量返回。这个数据是一个包含5个人的信息的列表,每个人都有名字、唯一标识符(guid)和几个其他字段,每个字段的长度都不超过32个字符,所以数据量不大。
我经常遇到这个OverflowError异常,但我不太明白“unsupported utf-8 sequence length”指的是什么。
self.request.write(ujson.dumps(response))
exceptions.OverflowError: 编码字符串时不支持的UTF-8序列长度
2 个回答
我最近遇到了同样的错误,想分享一下我的经验。
如果你看到这个错误,可能是因为你在用 Python 的 ujson 库对 MongoDB 的对象进行 json 编码。
如果用 Python 自带的库,就能得到更清晰的错误信息:
TypeError: ObjectId('510652d322fc956ca9e41342') is not JSON serializable
ujson 在处理一个 ObjectId 对象时出现了问题,搞得一头雾水。解决这个问题有几种方法,最简单的就是在保存之前把 MongoDB 中的 '_id' 字段去掉。你也可以通过创建一个 ujson 的子类,来处理或转换 ObjectId,使其变成简单的字符串。
有疑问的时候,去查看源代码:http://code.google.com/p/rapidjson/source/browse/trunk/thirdparty/ultrajson/ultrajsonenc.c
这个错误发生在UTF-8的长度是5或6个字节的时候。这个JSON的实现不支持这种情况。如果你在浏览器中使用这些数据,它们也不会正常工作,因为这些字符超出了UTF-16的范围。
我会很惊讶如果这种情况经常发生;这种情况只会出现在Unicode代码点超过U+1FFFFF的字符上,而这样的字符非常罕见。大多数Python版本也不支持这些字符,因为它们超出了这个范围。你应该查清楚为什么这些字符会出现在你的数据中。