Django:处理非ascii参数

时间:2011-03-18 20:45:06

标签: python django unicode

我遇到了处理非ascii POST参数的问题。这是一个显示问题的CURL请求:

curl "http://localhost:8000/api/txt/" -d \
"sender=joe&comments=Bus%20%A3963.33%20London%20to%20Sydney"

comments中的英镑签名导致了这个问题:当我尝试使用request.POST['comments']执行任何操作时,我得到了:

UnicodeEncodeError: 'ascii' codec can't encode character u'\ufffd' in position 4: ordinal not in range(128)

例如,如果我只是尝试记录comments是什么:

message = request.POST.get('comments', None)
file('/tmp/comments.txt', 'wb').write(message)

我收到上述错误。或者当我尝试解码时,我得到同样的错误:

try:
    message = message.decode('ISO-8859-2','ignore').encode('utf-8','ignore')
except Exception, e:
    file('/tmp/ERROR-decode.txt','w').write(str(e))

使用:

生成ERROR-decode.txt
'ascii' codec can't encode character u'\ufffd' in position 4: ordinal not in range(128)

想法?

2 个答案:

答案 0 :(得分:2)

%A3错了。事实上它应该是%C2%A3%C5%81才能正确使用UTF-8。

另外,"Unicode In Python, Completely Demystified"

答案 1 :(得分:0)

我认为你必须首先将它传递给urllib.unquote()以删除HTTP执行的引用,然后,你可以使用正确的编码将字符串转换为unicode

>>> unicode(urllib.unquote("Bus%20%A3963.33%20London%20to%20Sydney"), \
            "iso-8859-2").encode("utf-8") 
'Bus \xc5\x81963.33 London to Sydney'