UnicodeEncodeError при форматировании u'ES SIOUF_1 'в Python 2 - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть этот код:

"'{}'".format(u'ES SIOUF_1')

При запуске в Python 2 я получаю следующую ошибку:

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 2: ordinal not in range(128)

Тот же код запускается из Python 3, дает:

>>> "'ES\xa0SIOUF_1'"

Мне не нужно ни того, ни другого.Что мне нужно, это:

>>> "'ES SIOUF_1'"

Я прочитал много вопросов о «кодировании» и «декодировании» символов в Python, и некоторые различия в этом отношении между Python 2 и 3.

ОднакоЯ искренне не понимаю их, и я хотел бы решить эту проблему для обеих версий Python, возможно.

Я заметил одну вещь:

type(u'ES SIOUF_1')

дает:

>>> <type 'unicode'> # PYTHON 2
>>> <class 'str'> # PYTHON 3

1 Ответ

0 голосов
/ 25 сентября 2018

Вы попали в угловую ловушку.Unicode определяет U+00A0 (u'\xa0' в нотации Python) как символ NO-BREAK SPACE.Он печатается точно так же, как обычный пробел (U+0020 или u'\x20'), но является отдельным символом и не входит в диапазон ASCII.удалось получить это пространство без перерывов в вашей строке Unicode, отсюда и странная печать в Python 3 и невозможность конвертировать ее в ascii в Python 2. Поскольку формат представляет собой простую (байтовую) строку в вашем коде Python 2, UnicodeСтрока неявно преобразуется в ascii, что вызывает исключение.Таким образом, в Python 2 вам нужно использовать формат Unicode, чтобы не получать ошибок:

u"'{}'".format(u'ES SIOUF_1')

будет работать так же, как и в Python 3.

Как исправить?

Правильный способ - избавиться от оскорбительного u'\x20' перед попыткой его обработать.Если вы не можете, вы можете явно заменить его обычным пробелом:

"'{}'".format(u'ES SIOUF_1'.replace(u'\xa0', u'\x20'))

должен дать то, что вы хотите, как в Python 2, так и в Python 3

...