Python Django:处理非ascii参数
我遇到了一个关于非ascii POST参数的问题。下面是一个显示问题的CURL请求:Python Django:处理非ascii参数,python,django,unicode,Python,Django,Unicode,我遇到了一个关于非ascii POST参数的问题。下面是一个显示问题的CURL请求: curl "http://localhost:8000/api/txt/" -d \ "sender=joe&comments=Bus%20%A3963.33%20London%20to%20Sydney" 英镑登录comments导致了问题:当我尝试使用请求做任何事情时。发布['comments']我得到: UnicodeEncodeError: 'ascii' codec can't encode
curl "http://localhost:8000/api/txt/" -d \
"sender=joe&comments=Bus%20%A3963.33%20London%20to%20Sydney"
英镑登录comments
导致了问题:当我尝试使用请求做任何事情时。发布['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
>>> unicode(urllib.unquote("Bus%20%A3963.33%20London%20to%20Sydney"), \
"iso-8859-2").encode("utf-8")
'Bus \xc5\x81963.33 London to Sydney'
%A3
错误。事实上,它应该是%C2%A3
或%C5%81
,才能成为正确的UTF-8
还有,.对不起,Stefano,我没有明确说明这是在Django的背景下;django已经为您取消了POST参数的引号,所以“comments”已经是一个没有引号的字符串了。@Parand:ah ok。很公平。然后您收到的是一个字符串,它必须通过正确的编码转换为unicode。我使用
unicode(str,“encoding”)
,这是明确的意图。然后您可以.encode()
将此unicode对象转换为utf-8,如果您愿意的话。不,收到的是一个字符串,该字符串已被错误地转换为unicode
,因此存在U+FFFD。请求来自外部服务,因此我无法控制其内容。我试过用%C2%A3进行测试,它只是改变了错误:“ascii”编解码器无法对字符u'\xa3'进行编码。这更接近了。现在请阅读这篇文章,了解原因。谢谢伊甘西奥。我已经多次阅读了该演示文稿,并尝试了上面所示的.decode().encode()序列。它给出了上述错误。旁边有什么东西吗。decode()。encode我应该试试吗?@Parand:没有。我怎么知道?您仍然坚持解码unicode
。