2011-03-18 3 views
2

non-ascii POST 매개 변수를 다루는 문제가 있습니다. comments의 파운드 기호가 문제를 일으키는Django : non-ascii 매개 변수 다루기

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

: 여기에 문제를 보여주는 CURL 요청의 내가 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) 

내가 위의 오류가 발생합니다.

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

아이디어 :

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을 생산 : 나는 그것을 해독하려고 할 때 또는, 저도 같은 오류가?

답변

0

나는 당신이이 HTTP에 의해 수행 인용이 제거 urllib.unquote()로 먼저 통과해야 생각, 다음, 당신은

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

미안 스테파노, 나는 그것이 장고의 맥락에서 분명하다는 것을 분명히하지 않았다. django는 이미 POST 매개 변수를 따옴표로 묶지 않으므로 'comments'는 따옴표로 묶지 않은 문자열입니다. – Parand

+0

@Parand : 아 좋아. 충분히 공정하다. 당신이받는 것은 적절한 인코딩을 통해 유니 코드로 변환되어야하는 문자열입니다. 나는 의도적으로 명확한'unicode (str, "encoding")'을 사용한다. 그런 다음,이 유니 코드 객체를 utf-8로'.encode()'할 수 있습니다. –

+0

아니요. 이미 수신 된 문자열이 잘못 '유니 코드'로 변환되었으므로 U + FFFD가 있습니다. –

2

%A3이 잘못 적절한 인코딩을 유니 코드로 문자열을 변환 할 수 있습니다. 올바른 UTF-8이 되려면 실제로는 %C2%A3 또는 %C5%81이어야합니다.

또한 "Unicode In Python, Completely Demystified"입니다.

+0

요청이 외부 서비스에서 오는 것이므로 해당 내용을 제어 할 수 없습니다. 나는 % C2 % A3으로 테스트 해보았으며 에러를 변경합니다 : 'ascii'코덱은 문자 '\ xa3'을 인코딩 할 수 없습니다. – Parand

+1

그게 더 가깝습니다. 그 이유를 이해하기 위해이 기사를 읽으십시오. –

+0

감사합니다 Igancio. 나는 그 프레젠테이션을 여러 번 읽었고, 위에서 보았 듯이 .decode(). encode() 시퀀스를 시도했다. 위에서 언급 한 오류를 제공합니다. .decode() 옆에 뭔가가 있나요? – Parand

관련 문제