UnicodeEncodeError, когда __str__ уже возвращает Unicode - PullRequest
0 голосов
/ 26 февраля 2019

У нас есть следующая отформатированная строка:

'{}: {}.'.format(message, object)

Что поднимается:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

Строка объекта не ascii, но метод переопределяется, так что он возвращает Unicodeстрока:

def __str__(self):
    return unicode(self.name)

Почему тогда поднимается UnicodeEncodeError?Что я могу сделать, чтобы это исправить?

Я пытался превратить строку в юникодную:

u'{}: {}.'.format(message, object)

Но это портит строку объекта.Возвращает \xf1\xf1\xf1\xf1 вместо ññññ.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

В Python 2 обычные строки - это байтовые строки.И __str__ должен никогда возвращать строку в юникоде: вы нарушаете контракт str.Если вам нужно преобразование юникода для вашего объекта, используйте специальную функцию __unicode__:

def __unicode__(self):
    return unicode(self.name)

или даже лучше return self.name.decode(encoding), где кодировка - это кодировка self.name.

И никогда не смешивайтеUnicode-строки и байтовые строки без явного кодирования.Таким образом, правильный путь таков:

'{}: {}.'.format(message, unicode(object).encode(encoding))

И здесь кодировка представляет то, что вы хотите для внешнего представления.Обычные кодировки Latin1 или cp1252 в Windows и часто utf-8 в Linux

0 голосов
/ 26 февраля 2019

Я рекомендую функции decode и encode, как указано ниже:

class A(object):
    def __str__(self):
        return "速度快".decode("utf-8", "ignore")

obj = A()
print u"{}".format(obj)

add u

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...