2014-11-09 5 views
0
from urllib.request import urlopen 

def ShowResponse(param): 
    uri = str("mysite.com/?param="+param+"&submit=submit") 
    print(urlopen(uri).read()) 

file = open("myfile.txt","r") 
if file.mode == "r": 
    filelines = file.readlines() 
    for line in filelines: 
     line = line.strip() 
     ShowResponse(line) 

파이썬에서 오류를 던지고 urlopen()하지만 난이 프로그램을 실행할 때 그것은 "UnicodeEncodeError: 'ascii' codec can't encode characters in position 47-49: ordinal not in range(128)는 " 내가이 문제를 해결하는 방법을 잘 모릅니다 오류가 발생합니다.이 내 파이썬 코드 3.3

답변

0

난 파이썬 새로운 메신저 스택 추적에서 4 행 (uri = str(...)이 주어진 오류를 던지고 myfile.txt에 UTF-8 문자가 포함되어 있다고 가정합니다.

오류는 유니 코드 개체를 변환하려고했기 때문에 발생합니다 (가정 된 UTF- 8) ASCII 문자열 개체. ASCII 단순히 문자를 나타낼 수 없습니다.

URI (쿼리 문자열 포함)는 비 ASCII 문자를 백분율 인코딩 된 UTF-8 바이트로 인코딩해야합니다. 예 :

€ (EURO 기호)로 인코딩 UTF-8은 :

0xE2가 0x82 0xAC

퍼센트 인코딩, 그것은 같습니다

퍼센트의 E2 % 82 % AC

따라서, 귀하의 코드는 UTF-8로 매개 변수를 다시 인코딩 할 필요가 다음 퍼센트 인코딩을 :

또한 내가 약간 및 String.format를 사용하도록 uri = 정의를 변경 한 볼
from urllib.request import urlopen, quote 


def ShowResponse(param): 
    param_utf8 = param.encode("utf-8") 
    param_perc_encoded = quote(param_utf8) 

    # or uri = str("mysite.com/?param="+param_perc_encoded+"&submit=submit") 
    uri = str("mysite.com/?param={0}&submit=submit".format(param_perc_encoded)) 
    print(urlopen(uri).read()) 

() (https://docs.python.org/2/library/string.html#format-string-syntax), +를 사용하여 문자열 연결을 수행하는 것보다 복잡한 문자열을 만드는 것이 더 쉽습니다. 이 예에서 {0}.format()의 첫 번째 인수로 바뀝니다.