【问题标题】:OverflowError: Unsupported UTF-8 sequence length when > encoding string溢出错误:> 编码字符串时不支持 UTF-8 序列长度
【发布时间】:2011-12-07 20:41:57
【问题描述】:

在 Twisted Resource 中,我返回一个 json 编码的 dict 作为下面的响应变量。数据是一个包含 5 个人的列表,其中包含姓名、guid 和几个其他字段,每个字段的长度都小于 32 个字符,所以不是很多数据。

我经常遇到这个 OverflowError 异常,但我不太明白不受支持的 utf-8 序列长度指的是什么。

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

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

【问题讨论】:

  • 查看response 内容并尝试base64.urlsafe_b64encode 您在其中的字节字符串。
  • 当我有uuid.uuid4() 的列表时出现此错误,但应该是str(uuid.uuid4())
  • @MartinThoma:感谢您的洞察力。这也是为我解决问题的原因

标签: python twisted


【解决方案1】:

只是说明我最近遇到了同样的错误,可以提供一点背景。

如果您看到此内容,则可能是您尝试在 python 中使用 ujson 对 Mongo 对象进行 json 编码。

使用原生 python 库,我们会得到更有用的错误消息:

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

ujson 以某种方式试图解析 ObjectId python 对象并迷路了。有几个选项,最直接的是在保存之前从 Mongo 中擦除“_id”字段。您还可以将 ujson 子类化,以某种方式将 ObjectIds 解析或转换为简单的字符串。

【讨论】:

  • 我试图修改json_utilin bson.py (pymongo) 并将import json 替换为import ujson as json 它没有用,他们不分享方法:(
  • 你拯救了这一天。
  • 这可以通过将default_handler 参数设置为str 来解决,如下所示:jsonResult = df.to_json(default_handler=str)。该问题已在此处讨论:github.com/pandas-dev/pandas/issues/14256 并包含解释。
【解决方案2】:

如有疑问,请查看来源:http://code.google.com/p/rapidjson/source/browse/trunk/thirdparty/ultrajson/ultrajsonenc.c

当 UTF-8 长度为 5 或 6 个字节时会发生此错误。这个 JSON 实现没有实现它。如果您在浏览器中使用数据,这些字符将不起作用,因为它们超出了 UTF-16 的范围。

如果这真的经常发生,我会感到惊讶;它只会发生在 U+1FFFFF 上的 Unicode 代码点上,这种情况非常罕见,由于超出此范围,大多数 Python 版本甚至不支持 Unicode 字符串。您应该找出这些字符出现在您的数据中的原因。

【讨论】:

  • 谢谢格伦。仍然习惯 Python 并认为这是一个 Twisted 问题,没有考虑查看 ujson,因为它与其他数据一起工作正常。数据确实通过套接字连接进入应用程序,所以这很可能是罪魁祸首。非常感谢。
  • 我不明白为什么“在 BMP 之外”与浏览器是否可以为特定代码点呈现字形的问题特别相关。在我看来,这也确实是实现中的一个错误; JSON 规范非常明确,“char”是“除双引号或反斜杠或控制字符之外的任何 Unicode 字符”。
  • @Karl:只是一个错字;重要的是范围:[0,0x1FFFFF]。 JavaScript 使用 UTF-16,它只能表示该范围内的代码点。在实践中,输出 ASCII 的 JSON 序列化器使用 UTF-16 代理,并且只能输出这个范围; JSON 没有 8 字节的 Unicode 转义。
  • 结论,我将数据存储在 MongoDB 中。错误来自 Mongo 从数据库返回的默认 _id 值。我取消了那个字段,错误就消失了。再次感谢您为我指明正确的方向。
猜你喜欢
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多