2011-03-18 79 views
2

我遇到了处理非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) 

想法?

回答

0

我认为你必须首先将它传递到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' 
+0

对不起Stefano,我没有说清楚它是在Django的背景下; django已经为你引用了POST参数,所以'comments'是一个没有引号的字符串。 – Parand 2011-03-18 20:53:36

+0

@Parand:好的。很公平。那么您收​​到的是必须通过正确的编码转换为unicode的字符串。我使用'unicode(str,“encoding”)'这是明确的意图。然后,如果你愿意的话,你可以'编码()'这个unicode对象为utf-8。 – 2011-03-18 20:55:23

+0

不,接收的是一个字符串,它已经被错误地转换为“unicode”,因此存在U + FFFD。 – 2011-03-18 20:57:06

2

%A3是错误的Unicode字符串。它实际上应该是%C2%A3%C5%81以便正确的UTF-8。另外,"Unicode In Python, Completely Demystified"

+0

该请求是由外部服务提供给我的,因此我无法控制其内容。我曾尝试使用%C2%A3进行测试,但它只是更改错误:'ascii'编解码器无法编码字符u'\ xa3'。 – Parand 2011-03-18 20:56:25

+1

那就近了。现在只需阅读该文章即可了解原因。 – 2011-03-18 20:58:53

+0

谢谢Igancio。我已经多次阅读过演示文稿,并尝试了如上所示的.decode()。encode()序列。它给出了上面提到的错误。除了.decode()之外还有什么东西吗?encode我应该试试? – Parand 2011-03-18 20:59:42