Подтвердить что ты не робот

UnicodeEncodeError: кодек "ascii" не может кодировать символ u '\ u2013' в позиции 3 2: порядковый номер не в диапазоне (128)

Я разбираю файл xsl с помощью xlrd. Большинство вещей прекрасно работают. У меня есть словарь, где ключи являются строками, а значения - списками строк. Все ключи и значения являются unicode. Я могу напечатать большинство ключей и значений с помощью метода str(). Но некоторые значения имеют символ юникода - \u2013, для которого я получаю указанную выше ошибку.

Я подозреваю, что это происходит потому, что это unicode, встроенный в unicode, и интерпретатор python не может его декодировать. Итак, как я могу избавиться от этой ошибки?

Спасибо заранее.

4b9b3361

Ответ 1

Вы также можете печатать объекты Unicode, вам не нужно делать str() вокруг него.

Предполагая, что вам действительно нужна str:

Когда вы выполняете str (u '\ u2013'), вы пытаетесь преобразовать строку Unicode в 8-битную строку. Для этого вам нужно использовать кодировку, сопоставление данных Unicode с 8-битными данными. Что делает str(), это то, что использует кодировку по умолчанию системы, которая под Python 2 является ASCII. ASCII содержит только 127 первых кодовых точек Unicode, то есть от \u0000 до\u007F1. В результате вы получаете вышеуказанную ошибку, кодек ASCII просто не знает, что такое \u2013 (это длинный тире, кстати).

Поэтому вам нужно указать, какую кодировку вы хотите использовать. Обычными являются ISO-8859-1, наиболее известный как Latin-1, который содержит 256 первых кодовых точек; UTF-8, который может кодировать все кодовые точки с использованием кодирования с переменной длиной, CP1252, который является общим для Windows, и различными китайскими и японскими кодировками.

Вы используете их следующим образом:

u'\u2013'.encode('utf8')

Результатом является str, содержащая последовательность байтов, которая представляет собой представление uTF8 рассматриваемого символа:

'\xe2\x80\x93'

И вы можете распечатать его:

>>> print '\xe2\x80\x93'
–

Ответ 2

Вы также можете попробовать это, чтобы получить текст.

foo.encode('ascii', 'ignore')

Ответ 3

Как здесь str(u'\u2013') вызывает ошибку, поэтому используйте isinstance(foo,basestring) для проверки unicode/string, если не для базовой строки типа, преобразуйте ее в Unicode, а затем примените encode

if isinstance(foo,basestring):
    foo.encode('utf8')
else:
    unicode(foo).encode('utf8')

далее читать

Ответ 4

У меня была та же проблема. Эта работа прекрасна для меня:

str(objdata).encode('utf-8')

Ответ 5

для меня это работает

Юникода (данные).encode( 'UTF-8')