Django:防止字符串被unicode转义?

时间:2013-06-20 19:11:47

标签: python django encoding

我正在尝试阻止POST请求中的字符串(在本例中为value变量)进行转义,因为它要存储在JSON中。我的代码是

def addProduct(request):
    if request.POST:
        post = {}
        for key in request.POST:
            value = request.POST[key].encode('utf-8')
            try:
                value = json.loads(value).encode('utf-8')
            except Exception:
                pass
            post[key] = value.encode('utf-8')
        doc = json.dumps(post)

调试我可以看到value的类型是unicode,我相信Django是如何处理请求对象的。实际的字符串虽然unicode没有得到它的特殊字符转义,直到post[key] = value。如果我尝试将其更改为post[key] = value.encode('utf-8')以防止它被转义,我会收到错误:'ascii' codec can't decode byte 0xe2 in position 38: ordinal not in range(128)

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

如果您希望json.dumps维护特殊字符,我认为您可能会发现参数ensure_ascii=False很有用。

  1. 看一下这个答案:Unicode values in strings are escaped when dumping to JSON in Python
  2. This is the docs for json.dumps
  3. 我认为ensure_ascii=False不会自己做,而是解决json转义输出的问题。

    例如:

    json.dumps({'h':u'\xc2\xa3'},ensure_ascii=False)
    >>>u'{"h": "\xc2\xa3"}'
    

    更新json.dumps有无ensure_ascii和unicode字符串的比较:

    In [7]: json.dumps({'a':u'\u00a3'},ensure_ascii=False)
    Out[7]: u'{"a": "\xa3"}'
    
    In [8]: json.dumps({'a':u'\u00a3'})
    Out[8]: '{"a": "\\u00a3"}'
    

    希望这有帮助!

答案 1 :(得分:0)

我无法重现这一点。我尝试了两个json.dumps Unicode对象和UTF-8编码的字节字符串,在这两种情况下我都得到了正确的Unicode转义json数据:

>>> json.dumps({'foo': u'lölölö'})
'{"foo": "l\\u00f6l\\u00f6l\\u00f6"}'
>>> json.dumps({'foo': u'lölölö'.encode('utf8')})
'{"foo": "l\\u00f6l\\u00f6l\\u00f6"}'

我在Python 2.6和2.7以及Python 3.1中尝试过这个:

>>> json.dumps({'foo': 'lölölö'})
'{"foo": "l\\u00f6l\\u00f6l\\u00f6"}'