Python Django:处理非ascii参数

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

我遇到了一个关于非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 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