2013-06-07 16 views
0

У меня очень странная проблема с кодировкой. Я рассмотрел множество вопросов об этой ошибке без фактических ответов. Я знаю Unicode проблемы в Python, так что я начинаю каждый файл с:UnicodeDecodeError: кодек ascii не может декодировать байт в Python

# -*- coding: utf-8 -*- 

Однако, я все еще получаю UnicodeDecodeError, когда я бегу мое программное обеспечение. Кроме того, следующий код работает:

# -*- coding: utf-8 -*- 
g = " " 
s = "2 000€" 
if g in s: 
    print s 

Ошибка возникает при:

if gap not in tokenString: 

tokenString строка содержит Unicode. Самое смешное, что если я попытаюсь распечатать его непосредственно перед этой строкой, он печатает без ошибок.

Что может быть причиной этого? Я чувствую, что у меня что-то не хватает, и я не понимаю, что.

EDITED gap имеет тип unicode и tokenString типа str.

+0

Пожалуйста, включите * full * traceback. Вы печатаете данные Unicode на консоли Windows или в терминале Unix? Затем см. Http://wiki.python.org/moin/PrintFails. –

+0

Какой тип 'gap'? Какой тип 'tokenString'? – abarnert

ответ

3

Вы не дали нам достаточно информации, чтобы решить вашу проблему точно, но я могу сделать предположение:

Если gap является str и tokenString является unicode, эта линия:

if gap not in tokenString: 

... попытается преобразовать gap в unicode, чтобы сделать поиск. Но если gap имеет любые символы, отличные от ASCII, например, потому что это строка Юникода, закодированная в UTF-8, это преобразование не удастся.

Например:

>>> if 'é' in u'a': 
... print 'Yes' 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 

Вы получите ту же проблему, если gap является unicode и tokenString является str проведение не-ASCII:

>>> if u'a' in 'é': 
...  print 'Yes' 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 

И вы также получите тот же проблемы или аналогичные, с различными другими вызовами оператора и метода смешанного типа (например, u'a'.find('é')).


Решение использовать тот же самый тип с обеих сторон in. Например:

>>> if 'é'.decode('utf-8') in u'a': 
...  print 'Yes' 

Ошибка.


Чем больше решений является всегда использовать один тип или другой везде внутри нашего кода. Разумеется, на границах вы не можете этого сделать (например, если вы используете unicode всюду, но тогда вы хотите записать в 8-битный файл), поэтому вам нужно явно называть decode и encode на этих границах. Но даже тогда вы можете обычно обернуть это (например,, с codecs.open или с помощью специальной функции записи файлов или что-то еще, поэтому весь ваш видимый код - Unicode, fill stop.


Или, конечно, вы можете использовать Python 3, который сразу же поймать вы пытаетесь сравнить байт строки и строки Unicode и поднять TypeError, вместо того, чтобы пытаться декодировать байт из ASCII и либо обманчиво рабочий или давая вам более запутанную ошибку ...

+0

Проблема заключалась в том, что 'gap' был загружен с помощью модуля' json', который создал объекты 'unicode', о которых я не знал. Я думал, что я использую один и тот же тип 'str' последовательно. –

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