Вы не дали нам достаточно информации, чтобы решить вашу проблему точно, но я могу сделать предположение:
Если 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 и либо обманчиво рабочий или давая вам более запутанную ошибку ...
Пожалуйста, включите * full * traceback. Вы печатаете данные Unicode на консоли Windows или в терминале Unix? Затем см. Http://wiki.python.org/moin/PrintFails. –
Какой тип 'gap'? Какой тип 'tokenString'? – abarnert