2013-07-02 2 views
20

버전 : 파이썬 2.7.3파이썬 요청 인코딩 POST 데이터

다른 라이브러리 : 파이썬 요청 1.2.3, jinja2 (2.6)

나는 포럼에 데이터를 제출하는 스크립트를 가지고 문제입니다 ASCII 문자가 아닌 문자는 쓰레기로 표시됩니다. 예를 들어 André Téchiné와 같은 이름이 André © Tin Chin ©으로 나옵니다. 여기

데이터가 제출 방법은 다음과 같습니다

1) 데이터가 처음 그래서 같은 UTF-8로 인코딩 된 CSV 파일에서로드됩니다

entries = [] 
with codecs.open(filename, 'r', 'utf-8') as f: 
    for row in unicode_csv_reader(f.readlines()[1:]): 
     entries.append(dict(zip(csv_header, row))) 

unicode_csv_reader 파이썬 CSV 문서 페이지의 하단에서입니다 : http://docs.python.org/2/library/csv.html

인터프리터에 항목 이름을 입력하면 이름이 u'Andr\xe9 T\xe9chin\xe9'으로 표시됩니다. 내가 렌더링 된 변수를 작성하는 경우, u'Andr\xe9 T\xe9chin\xe9'

이제 : 다시 내가 인터프리터에서 렌더링 이름을 입력하면

tpl = tpl_env.get_template(u'forumpost.html') 
rendered = tpl.render(entries=entries) 

은 내가 볼 같은 :

2) 다음으로 나는 jinja2를 통해 데이터를 렌더링

with codecs.open('out.txt', 'a', 'utf-8') as f: 
    f.write(rendered) 

하지만 포럼에 보내야합니다 :이 같은 파일 이름이 올바르게 표시

POST 요청 코드에서

3) 내가 가진 :

params = {u'post': rendered} 
headers = {u'content-type': u'application/x-www-form-urlencoded'} 
session.post(posturl, data=params, headers=headers, cookies=session.cookies) 

세션은 요청의 세션입니다.

그리고 이름이 포럼 게시물에 표시되지 않습니다.가 rendered.encode로 렌더링

  • 인코딩 ('UTF-8') (동일한 결과)
  • 렌더링 = urllib.quote_plus이 (렌더링) (로 나오는

    • 생략 헤더 : 나는 다음과 같은 시도 모든 %의 XY)

    내가 입력하면 rendered.encode는 ('UTF-8') 나는 다음을 참조는 :

    'Andr\xc3\xa9 T\xc3\xa9chin\xc3\xa9' 
    

    어떻게 문제를 해결할 수

    ? 감사.

    unicode(my_string_variable, "utf8") 
    

    또는 디코딩 및 인코딩 : UTF-8로 디코딩하는

  • 답변

    24

    당신의 클라이언트로는, 예를 들어해야 동작서버로 nc -l 8888를 실행하고 요청 :

    import requests 
    
    requests.post('http://localhost:8888', data={u'post': u'Andr\xe9 T\xe9chin\xe9'}) 
    

    쇼 :

    POST/HTTP/1.1 
    Host: localhost:8888 
    Content-Length: 33 
    Content-Type: application/x-www-form-urlencoded 
    Accept-Encoding: gzip, deflate, compress 
    Accept: */* 
    User-Agent: python-requests/1.2.3 CPython/2.7.3 
    
    post=Andr%C3%A9+T%C3%A9chin%C3%A9 
    

    당신이 올바른지 확인할 수 있습니다

    >>> import urllib 
    >>> urllib.unquote_plus(b"Andr%C3%A9+T%C3%A9chin%C3%A9").decode('utf-8') 
    u'Andr\xe9 T\xe9chin\xe9' 
    
    • 검사는 서버가 요청을 디코딩 바르게. 당신은 문자 집합을 지정을 시도 할 수 있습니다 : 그것은 상처를 안하고 올바른 서버 어쨌든 x-www-form-urlencoded 유형에 대한 매개 변수를 무시합니다 있도록

      headers = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"} 
      

      몸에는 ASCII 문자가 포함되어 있습니다. 문제가 디스플레이 유물 즉 아니다 URL-encoded form data

    • 검사에서 피투성이의 세부 사항을 찾아, 값이 정확하지만

    +0

    는 "문제가 표시 유물 즉 아닙니다 확인 잘못 표시 값이 올바른지 하지만 잘못 표시됩니다. "- 감사합니다. 그것이 문제이다! 불행히도 공개 포럼이고 기본 인코딩을 변경할 수 없습니다. 그것은 iso-8859-1 인코딩으로 응답합니다. rendered.encode ('iso-8859-1')를 사용할 수 있습니까? 감사. – TheMagician

    +1

    헤더에서 문자 세트를 설정하려고 시도했습니다. – jfs

    +0

    작동하지 않았습니다. – TheMagician

    1

    봅니다

    sometext = gettextfromsomewhere().decode('utf-8') 
    env = jinja2.Environment(loader=jinja2.PackageLoader('jinjaapplication', 'templates')) 
    template = env.get_template('mypage.html') 
    print template.render(sometext = sometext).encode('utf-8')