3

我在 django-rest-framework 中的 APIView 端点的输入中处理 unicode 字符时遇到问题。

我正在使用 UnicodeJsonRenderer 渲染器类和 JSONParser 类进行输入。

我的输入如下,使用带有 HTML 表单的 web 可浏览 api:

{
  "field": "hellö theré"
}

当我在视图中调用 request.DATA 时,我收到以下错误消息:

{
    "detail": "JSON parse error - 'utf8' codec can't decode byte 0xe2 in position 96: invalid continuation byte"
}

我对此进行了相当广泛的调试,我可以看出它在第 60 行崩溃parsers.py

data = stream.read().decode(encoding)

我不确定如何解决这个问题。虽然我怀疑它与编码格式有关,但对我来说感觉不对,因为我的代码库中有其他代码(不使用 django-rest-framework 库)可以优雅地处理 unicode 输入/输出,就像我的settings.DEFAULT_CHARSET 是 utf-8。

对此的任何帮助将不胜感激。

更新:我怀疑它与发送非 UTF-8 编码字符数据的 Web 可浏览 API 有关,尽管元标记确实将字符集设置为 utf-8 ...

更新 2:我已粘贴在表单提交时发送的 POST 请求的请求标头下方,媒体类型为“application/json”。我认为内容类型没有指定字符集很奇怪。(我在发送 POST 请求时使用 Chrome 浏览器调试工具发现了这一切):

POST /api/stuff/ HTTP/1.1
Host: localhost:8000
Connection: keep-alive
Content-Length: 356
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Origin: http://localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:8000/api/stuff/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: cookie-info
4

2 回答 2

3

问题是您的输入不是UTF-8!十六进制代码0xe2是 UTF-8 中的延续字节,需要另一个十六进制字符才能合法。但是十六进制代码0xe2âWindows-1252 中。只需确保您使用 Windows-1252(cp1252在 Python 中调用)正确解码字节流:

text.decode('cp1252')
于 2013-12-11T13:10:59.540 回答
0

这里有一些关于 JSON 渲染的文档。我怀疑问题与您发布的代码有关

data = stream.read().decode(encoding)

正在尝试解码已解码的字符串,因为您使用的是 UnicodeJsonRenderer。如果您访问该链接,您会发现 UnicodeJsonRenderer 没有字符集。所以,你不能解码它。

尝试使用另一个像 JsonPRenderer 或 HTMLFormRenderer

于 2013-12-11T13:46:02.997 回答