2014-01-13 4 views
0

Я бы просто хотел, чтобы код python работал, но эти ошибки преобразования я не понимаю (я всегда получаю некоторый тип ошибки «ascii» или ошибки декодирования). Я сошел с ума и сделал декодирование и закодировал на каждой части линии, и это все еще вызывает у меня проблемы. Он доступен через GIT по адресу https://github.com/TBOpen/papercut, если вы были бы так добры, чтобы исправить его (я также решил аналогичную ошибку, не подтвержденную в строке 885, используя self.wfile.write(message.decode('cp1250', 'replace').encode('ascii', 'replace') + "\r\n").Python: UnicodeEncodeError 'ascii' codec

Однако вот следа за тот, который я не могу решить (где Я отказался).

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) 

ТИА !!

+0

Вы используете python 2.x или python 3.x? –

+0

@ mig-25foxbat: Python 2.6, из трассы. –

+0

Можете ли вы вставить свой код py? –

ответ

1

корень проблемы в том, что один из response, result[0] или result[1] на самом деле является unicode строка, а не закодированный str строка.

Итак, когда вы звоните (выбираете один произвольно) response.decode('cp1250', 'replace'), вы просите декодировать что-то, что уже декодировано в Unicode. Что Python 2.x делает с этим, это сначала закодировать его по умолчанию (ASCII), чтобы он мог декодировать его по вашему запросу. И вот почему вы получаете UnicodeEncodeError от попытки позвонить по телефону decode. *

Чтобы исправить это, вам нужно выяснить, какая из трех неверна и почему. Это невозможно с гигантским беспорядком в заявлении с 4-мя декодированными вызовами в нем, но это легко, если вы разложите его на отдельные операторы или просто добавьте некоторую print отладку, чтобы увидеть, что находится в этих переменных прямо перед тем, как они привыкнут.

Тем не менее, это сделало бы вашу жизнь намного проще для реорганизации вашего кода. Вместо того, чтобы преобразовывать все взад и вперед по всему месту, предоставляя себе десятки мест, чтобы сделать простую ошибку, которая в конечном итоге вызывает недопустимую ошибку на полпути через вашу программу, просто расшифруйте весь свой вход во время ввода, обработайте все как Unicode , затем закодировать все во время вывода.

Кстати, если вы еще не прочитали Unicode HOWTO Python и сообщение в блоге The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!), прочитайте их, прежде чем идти дальше.


* Если вы считаете, что это глупый дизайн для языка ... ну, это основная причина, по которой существует Python 3. В Python 3 вы не можете decode a unicode или encode a bytes, поэтому ошибка появляется как можно раньше и сообщает вам, что именно не так, вместо того, чтобы пытаться выследить, где вы назвали неправильный метод неправильным типа и получил ошибку, которая не имеет смысла. Поэтому, если вы хотите использовать Python 2 вместо 3, вы не можете жаловаться на то, что дизайн Python 2 более глубже, чем 3-х.

Смежные вопросы