2014-01-13 2 views
0

나는 파이썬 코드가 작동하기를 원하지만이 변환 오류는 이해할 수 없다 (필자는 항상 'ascii'인코딩 또는 디코딩 오류가 발생한다). 나는 미쳐서 디코드하고 라인의 모든 부분을 인코딩하고 여전히 문제를 일으킨다. 그것은 GIT를 통해 https://github.com/TBOpen/papercut에서 수정할 수 있습니다. (비슷한 오류를 해결하기 위해 self.wfile.write(message.decode('cp1250', 'replace').encode('ascii', 'replace') + "\r\n")을 사용하여 885 행에 체크인하지 않았습니다.)파이썬 : UnicodeEncodeError 'ascii'코덱

그러나 여기서 내가 해결할 수없는 추적 기능이 있습니다. 나는) 포기했다.

Traceback (most recent call last): 
    File "/usr/local/lib/python2.6/SocketServer.py", line 535, in process_request 
    self.finish_request(request, client_address) 
    File "/usr/local/lib/python2.6/SocketServer.py", line 320, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/usr/local/lib/python2.6/SocketServer.py", line 615, in __init__ 
    self.handle() 
    File "./papercut.py", line 221, in handle 
    getattr(self, "do_%s" % (command))() 
    File "./papercut.py", line 410, in do_ARTICLE 
    self.send_response("%s\r\n%s\r\n\r\n%s\r\n.".decode('cp1250', 'replace').encode('ascii', 'replace') % (response.decode('cp1250', 'replace').encode('ascii', 'replace'), result[0].decode('cp1250', 'replace').encode('ascii', 'replace'), result[1].decode('cp1250', 'replace').encode('ascii', 'replace'))) 
    File "/usr/local/lib/python2.6/encodings/cp1250.py", line 15, in decode 
    return codecs.charmap_decode(input,errors,decoding_table) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 20: ordinal not in range(128) 

TIA!

+0

당신은 python 2.x 또는 python 3.x를 사용하고 있습니까? –

+0

@ mig-25foxbat : 파이썬 2.6, 추적합니다. –

+0

py 코드를 붙여 넣을 수 있습니까? –

답변

1

루트 문제는 result[0]response의 하나입니다, 또는 result[1] 실제로 unicode 아닌 문자열 인코딩 str 문자열입니다.

그래서 (임의로 선택하는) response.decode('cp1250', 'replace')을 호출하면 이미 유니 코드로 디코딩 된 것을 디코딩해야합니다. 파이썬 2.x가이 작업을 수행하기 위해서 먼저 요청을 디코딩 할 수 있도록 기본 인코딩 (ASCII)으로 인코딩해야합니다. 그래서 UnicodeEncodeErrordecode으로 전화를 시도하는 것입니다. *

이 문제를 해결하려면 세 가지 중 어느 것이 잘못되었는지, 왜 그 이유가 무엇인지 파악해야합니다. 그것은 4 개의 디코드 호출을 포함하는 성명서의 거대한 엉망으로는 불가능합니다. 그러나 별도의 문장으로 분해하거나 print 디버깅을 추가하여 사용하기 바로 전에 해당 변수를 확인하는 것은 쉽습니다.

그러나 코드를 완전히 재구성하는 것이 훨씬 쉽습니다. 모든 곳에서 앞뒤로 모든 것을 앞뒤로 변환하는 대신에 프로그램을 가로 질러 디버깅 할 수없는 오류를 일으키는 간단한 실수를하기 위해 수십 개의 장소를 제공하고 입력시 모든 입력을 디코딩하고 모든 것을 유니 코드로 처리합니다 출력 시간에 모든 것을 인코딩합니다.

그런데 파이썬의 Unicode HOWTO과 블로그 게시물 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)을 읽지 않았다면 더 이상 나가기 전에 읽으십시오.


*이 언어가 어리석은 디자인이라고 생각하면 ... 그게 파이썬 3의 주된 이유입니다. 파이썬 3에서는 decodeunicode 또는 encodebytes으로 할 수 없으므로 가능한 한 일찍 오류가 나타나고 틀린 방법을 잘못 호출 한 곳을 사냥하려고하는 대신 잘못된 것이 무엇인지 정확하게 알려줍니다 유형이 잘못되어 오류가 발생했습니다. 따라서 3 대신에 파이썬 2를 사용하고자한다면, 파이썬 2의 디자인이 3보다 더 끔찍하다고 불평하지 않아도됩니다.

관련 문제