[django]修复使用 QueryDict 时出现 “UnicodeEncodeError” 错误的问题

    当给 QueryDict 传入一个 unicode 字符串的时候会出现 “UnicodeEncoderError” 错误:

    In [1]: from django.http.request import QueryDict
    
    In [2]: s = u'a=%E4%BD%A0%E5%A5%BD'
    In [3]: QueryDict(s)
    ---------------------------------------------------------------------------
    UnicodeEncodeError                        Traceback (most recent call last)
    <ipython-input-10-e865795305d5> in <module>()
    ----> 1 QueryDict(s)
    
    /.../django/http/request.pyc in __init__(self, query_string, mutable, encoding)
        328                                         keep_blank_values=True):
        329                 try:
    --> 330                     value = value.decode(encoding)
        331                 except UnicodeDecodeError:
        332                     value = value.decode('iso-8859-1')
    
    /.../encodings/utf_8.pyc in decode(input, errors)
         14 
         15 def decode(input, errors='strict'):
    ---> 16     return codecs.utf_8_decode(input, errors, True)
         17 
         18 class IncrementalEncoder(codecs.IncrementalEncoder):
    
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
    

    从异常信息中我们可以发现,出现异常时因为 request.py 中尝试执行 decode 操作, 但是我们传递的是一个 unicode 编码的字符串所以就报错了。传递一个 str 字符串就可以了。

    In [4]: s
    Out[4]: u'a=%E4%BD%A0%E5%A5%BD'
    
    In [5]: QueryDict(s.encode('utf8'))
    Out[5]: <QueryDict: {u'a': [u'\u4f60\u597d']}>
    

    Comments