2012-01-07 4 views
5

웹 응용 프로그램에 POST 요청을 보내려고합니다. 나는 mechanize 모듈 (그 자체로 urllib2 래퍼)을 사용하고있다. 어쨌든 POST 요청을 보내려고하면 UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128)이 나옵니다. 나는 unicode(string)unicode(string, encoding="utf-8"), unicode(string).encode()을 퍼팅 시도 등, 아무 일하지 - 중 위의 오류를 반환하거나 TypeError: decoding Unicode is not supported파이썬에서 비 ASCII POST 요청을 보내시겠습니까?

나는 비슷한 질문에 다른 SO 답변 보았다, 그러나 아무도는 도움이되지 않습니다.

미리 감사드립니다.

편집 : 예 오류 발생 :

prda = "šđćč" #valid UTF-8 characters 
prda # typing in python shell 
'\xc5\xa1\xc4\x91\xc4\x87\xc4\x8d' 
print prda # in shell 
šđćč 
prda.encode("utf-8") #in shell 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128) 
unicode(prda) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128) 
+0

오류를 생성하는 작은 독립적 인 예를 보여 주면 도움이됩니다. – ekhumoro

+0

@ekhumoro가 예제를 추가했습니다. 그걸 지우길 바랍니다. –

답변

7

난 당신이 파이썬 2.x 또는 3.0을 사용하고있는 가정을

는 유니 코드 개체를 감안할 때 : 당신이 명시 적으로 인코딩을 지정해야합니다

mystr = myUnicode.encode('utf-8') 

참고 :

myUnicode = u'\u4f60\u597d' 

인코딩이이 UTF-8을 사용. 기본적으로 (일반적으로) ascii를 사용합니다.

+0

답장을 보내 주셔서 감사합니다. 문자열 변수 (문자열 대신)가있는 경우 유니 코드 개체로 변환하는 방법은 무엇입니까? 문자열 변수가 할당되기 전에 단순히'u '접두사를 추가하기 위해 코드에 깊이 묻혀 있습니다. –

0

이미 DE는 유니 코드 개체를 얻을 수를 -code에 아무것도, 당신이 필요합니다 :) 인코딩하고 있기 때문에 당신은 unicode 전화에 문자를 포장 할 필요가 없습니다 :

>>> s = '\xc5\xa1\xc4\x91\xc4\x87\xc4\x8d' # your string 
>>> s.decode('utf-8') 
u'\u0161\u0111\u0107\u010d' 
>>> type(s.decode('utf-8')) 
<type 'unicode'> 

을 나는 정확히 그것이 정확하게 처리되는지 여부를 정확히 알지 못하므로 mechanize을 모른다. 나는 두려워한다.

나는 일반 urllib2 POST 호출로 할 거라고 무엇, urlencode 사용하는 것입니다 : 당신의 예에서

>>> from urllib import urlencode 
>>> postData = urlencode({'test': s }) # note I'm NOT decoding it 
>>> postData 
'test=%C5%A1%C4%91%C4%87%C4%8D' 
>>> urllib2.urlopen(url, postData) # etc etc etc 
1

을, 당신은 결과 비 ASCII 문자가 포함 된 문자 비 유니 코드 문자열을 사용 prda바이트 문자열이됩니다.

이렇게하려면 파이썬은 sys.stdin.encoding을 사용하여 자동으로 문자열을 인코딩합니다. 귀하의 경우 이것은 문자열이 "utf-8"로 인코딩 된 것을 의미합니다.

>>> print prda.decode('utf-8') 
šđćč 

참고 스크립트 나 모듈이 자동으로 인코딩을 추측 파이썬에 의존 할 수있어서 : 유니 코드 객체에 prda를 변환하려면

, 당신은 적절한 인코딩을 사용하여 디코딩 할 필요가 - 명시 적으로 다음과 같이 파일의 상단에있는 인코딩을 delare해야합니다 :

파이썬 2에서 유니 코드 오류가 발생할 때마다
# -*- coding: utf-8 -*- 

, 매우 자주 코드이기 때문이다 바이트 문자열을 유니 코드 문자열과 혼합합니다. 따라서 어떤 문자열이 오류의 원인인지 확인하려면 type(string)을 사용해야합니다.

문자열 개체가 <type 'str'>이지만 유니 코드가 필요한 경우 은 적절한 인코딩을 사용하여으로 디코딩합니다. 문자열 객체가 <type 'unicode'>이지만 바이트가 필요한 경우 은 적절한 인코딩을 사용하여 인 코드합니다.

관련 문제