Django:处理非ascii参数
问题描述:
我遇到了处理非ascii POST参数的问题。下面是显示问题的卷曲要求:Django:处理非ascii参数
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)
想法?
答
我认为你必须首先将它传递到urllib.unquote()通过HTTP进行的引用删除,那么,你可以转换与适当的编码
>>> unicode(urllib.unquote("Bus%20%A3963.33%20London%20to%20Sydney"), \
"iso-8859-2").encode("utf-8")
'Bus \xc5\x81963.33 London to Sydney'
对不起Stefano,我没有说清楚它是在Django的背景下; django已经为你引用了POST参数,所以'comments'是一个没有引号的字符串。 – Parand 2011-03-18 20:53:36
@Parand:好的。很公平。那么您收到的是必须通过正确的编码转换为unicode的字符串。我使用'unicode(str,“encoding”)'这是明确的意图。然后,如果你愿意的话,你可以'编码()'这个unicode对象为utf-8。 – 2011-03-18 20:55:23
不,接收的是一个字符串,它已经被错误地转换为“unicode”,因此存在U + FFFD。 – 2011-03-18 20:57:06