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

Python Django:防止字符串被unicode转义?,python,django,encoding,Python,Django,Encoding,我试图阻止POST请求中的字符串(在本例中是值变量)被转义,因为它将存储在JSON中。我的代码是 def addProduct(request): if request.POST: post = {} for key in request.POST: value = request.POST[key].encode('utf-8') try: value = json.load

我试图阻止POST请求中的字符串(在本例中是
变量)被转义,因为它将存储在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”编解码器无法解码第38位的字节0xe2:序号不在范围内(128)


有什么想法吗?

我不能复制这个。我尝试给出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"}'

如果您想要
json.dumps
来维护特殊字符,我想您可能会发现参数
确保ascii=False
很有用

  • 看看这个答案:
  • 与其自己做,不如确保ascii=False,我认为这将解决
    json
    转义输出的问题

    例:

    更新:比较有无
    json.dumps
    确保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"}'
    

    希望这有帮助

    在任何编码中,您都试图为
    encode(encoding='UTF-8',errors='ignore')
    post
    覆盖它。执行
    post[key]=value
    不会逃避任何事情,因此您的描述并不完全正确。“逃脱”是什么意思?您的输出是什么?您想要什么输出?@lennartreegebro转义为将诸如
    之类的文字字符替换为
    \xe2\x80\x99
    ,如果(a)不知道
    请求的内容。POST
    ,以及(b)这是无法回答的知道
    doc
    的最终值应该是什么。
    request.POST
    的内容只是HTML表单中的纯文本。最后一个
    doc
    是字符串的JSON doc,仅用反斜杠转义,而不是例如
    \xe2\x80\x99
    我想我没有很好地解释自己。我正试图阻止它逃走。我只想在JSON@KingFu:您可以这样做,但返回的JSON数据是一个Unicode对象。这就是你想要的吗?难道不是所有的JSON字符串都是unicode吗?只要字符串没有被转义,它的unicode/ascii就不重要了。我在android应用程序中使用它们,textview只显示转义字符literally@KingFu:否,默认情况下,在Python 2下,JSON数据是8位字符串。在Python3下,是unicode字符串。如果是ASCII,字符串必须转义,原因很明显。将
    确保_ASCII=False
    添加到
    json。dumps
    会出现错误
    “ASCII”编解码器无法解码第39位的字节0xe2:序号不在范围内(128)
    准确地使用字符串作为普通unicode。看到我的答案了,我用英镑符号示例对其进行了更新,在有和没有
    的情况下转储它,确保\u ascii
    。只要不编码任何东西,用
    确保ascii
    调用
    dumps
    。啊,成功!!!我删除了所有的
    .encode('utf-8')
    添加了
    确保ascii=False
    并且它可以工作,谢谢!
    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"}'