Python Unicode: Как я могу определить, нужно ли декодировать строку в utf-8? - PullRequest
2 голосов
/ 16 декабря 2010

У меня есть функция приема запросов из сети.В большинстве случаев передаваемая строка не является Unicode, но иногда это так.

У меня есть код для преобразования всего в Unicode, но он сообщает об ошибке:

message.create(username, unicode(body, "utf-8"), self.get_room_name(),\
TypeError: decoding Unicode is not supported

Я думаюпричина в том, что параметр 'body' уже является юникодом, поэтому unicode() вызывает исключение.

Есть ли способ избежать этого исключения, например, оценить тип перед преобразованием?

Ответы [ 4 ]

5 голосов
/ 16 декабря 2010
  1. Вы не декодируете в UTF-8, вы кодируете в UTF-8 или декодируете из .
  2. Вы можете безопасно декодировать из UTF8 дажеесли это просто ASCII.ASCII является подмножеством UTF8.
  3. Самый простой способ определить, требуется ли декодирование или нет, - это

    if not isinstance(data, unicode):
        # It's not Unicode!
        data = data.decode('UTF8')
    
0 голосов
/ 16 декабря 2010

Вот что я использую:

def to_unicode_or_bust(obj, encoding='utf-8'):
    if isinstance(obj, basestring):
        if not isinstance(obj, unicode):
            obj = unicode(obj, encoding)
    return obj

Из этой презентации взято: http://farmdev.com/talks/unicode/

И это пример кода, который использует его:

def hash_it_safe(s):
    try:
        s = to_unicode_or_bust(s)
        return hash_it_basic(s)
    except UnicodeDecodeError:
        return hash_it_basic(s)
    except UnicodeEncodeError:
        assert type(s) is unicode
        return hash_it_basic(s.encode('utf-8'))

У кого-нибудь есть мысли о том, как улучшить этот код? ;)

0 голосов
/ 16 декабря 2010

Марк Пилигрим написал библиотеку Python, чтобы угадать кодировки текста:

В Unicode и UTF-8 первые два раздела главы 4 его книги «Погружение в Python 3» довольно хороши:

0 голосов
/ 16 декабря 2010

Вы можете использовать это:

try:
   body = unicode(body)
except UnicodeDecodeError:
   body = body.decode('utf8')

Или это:

try:
   body = unicode(body, 'utf8')
except TypeError:
   body = unicode(body)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...