2012-11-20 3 views
1

Robot 프레임 워크를 사용하여 HTTP POST 관련 테스트를 자동화하고 있습니다. HTTP POST를 수행하는 함수가있는 사용자 정의 Python 라이브러리를 작성했습니다. 다음과 같이 보입니다.Python 함수의 디코딩 오류

# This function will do a http post and return the json response 
def Http_Post_using_python(json_dict,url): 
    post_data = json_dict.encode('utf-8') 
    headers = {} 
    headers['Content-Type'] = 'application/json' 
    h = httplib2.Http() 
    resp, content = h.request(url,'POST',post_data,headers) 
    return resp, content 

유니 코드 문자를 사용하지 않는 한 정상적으로 작동합니다. 내가 (예를 들어, 메시지)를 json_dict 변수에 유니 코드 문자가있는 경우,이 오류와 함께 실패합니다

UnicodeDecodeError: 'ascii' codec can't decode byte 0xeb in position 164: ordinal not in range(128)

내가 몇 가지 관련 질문을보고 윈도우 7에 파이썬 2.7.3을 실행하고,하지만 난하지 않은 문제를 해결할 수있었습니다. 필자는 파이썬과 프로그래밍에 익숙하지 않으므로 도움을받을 수 있습니다.

감사합니다.

+1

* 전체 * 추적을 포함하십시오. –

+0

post_data = unicode (json_dict, encoding = "utf-8")를 사용해 보셨습니까? 인코딩/디코딩/구문 분석이 어떻게 작동하는지 명확하게 밝히지는 않았지만 (이것이 이유이며 대답이 아닙니다) 어쩌면 도움이 될 것입니다 ... – BorrajaX

+1

@BorrajaX'unicode (json_dict, encoding = "utf- 8 ")'은 OP가 원하는 것의 정반대가 될 것입니다. 그들은''유니 코드가 아닌''str '을 원합니다. –

답변

2

json_dictstr이고 unicode이 아니기 때문에이 오류가 발생합니다. 응용 프로그램에 대해 아무 것도 모른 채, 간단한 해결책은 다음과 같습니다

if isinstance(json_dict, unicode): 
    json_dict = json_dict.encode("utf-8") 
post_data = json_dict 

을하지만, 당신은 json_dict을 만들 json.dumps(…)를 사용하는 경우, 당신은 그것을 인코딩 할 필요가 없습니다 - json.dumps(…) 수행 할 것 .

+0

답장을 보내 주셔서 감사합니다. json.dumps가 트릭을했습니다. – user1840125

1

사용 requests :

requests.post(url, data=data, headers=headers) 

그것은 당신을위한 인코딩 처리됩니다. 당신 때문에 기본적으로 버그와 간단히 파이썬 3에서 수정되었습니다 파이썬 2의 자동 인코딩/디코딩, 파이썬의 오류를 얻고


2의 str 객체는 정말 "바이트", 그리고 권리 문자열 데이터를 처리하는 방법은 unicode 개체에 있습니다. unicode이 나중에 소개 되었기 때문에, Python 2는 혼란 스러울 때 자동으로 문자열과 문자열을 변환하려고 시도합니다. 이렇게하려면 인코딩을 알아야합니다. 지정하지 않으므로 기본값은 ascii이며 필요한 문자는 없습니다.

왜 파이썬이 자동으로 디코딩을 시도합니까? str 개체에서 .encode()을 호출하기 때문입니다. 이미 인코딩되었으므로 파이썬은 먼저 디코딩하려고 시도하고 ascii 인코딩을 추측합니다.


The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)을 읽어야합니다.

+0

응답 해 주셔서 감사합니다. – user1840125

-3

이 시도 :

#coding=utf-8 
test = "메시지" 
test.decode('utf8') 

을 난 그냥 UTF-8로 파일 인코딩을 설정 라인 #coding=utf-8에서 (쓸 수 있도록 "메시지").

문자열을 utf-8로 디코딩해야합니다. decode method documentation

+0

소스 코드 인코딩 설정은 소스 코드, 특히 리터럴에만 적용됩니다. 다른 유니 코드 바이트 변환을 마술처럼 해결하지 않습니다. –

관련 문제