полностью перепутанный к настоящему времени... Я разрабатываю в python/django и использую вход Python. Все мое приложение требует unicode, и все мои модели имеют только unicode ()', возвращаются u'..' методы реализованы. Теперь при входе я натолкнулся на действительно странную проблему, что требовалось много времени, чтобы обнаружить, что я мог воспроизвести его. Я попробовал и Py 2.5.5 и Py 2.6.4 и то же самое. Так
Каждый раз, когда я делаю некоторый прямой вход как:
logging.debug(u'new value %s' % group)
это называет модели group.unicode (): возвратите unicode (group.name)
Мои unicode методы все похоже на это:
def __unicode__(self):
return u'%s - %s (%s)' % (self.group, self.user.get_full_name(), self.role)
Это работает, даже если group.name XXX или ÄÄÄ (требующий unicode). Но когда я по некоторым причинам хочу зарегистрировать набор, список, словарь, набор django-запроса и отдельные экземпляры в, например, список мог бы быть unicode, или не я попадаю в беду...
Таким образом, это получит меня UnicodeDecodingError каждый раз, когда group.name требует unicode как Luleå (мой родной город)
logging.debug(u'new groups %s' % list_of_groups)
Обычно я получаю ошибку как это:
Exception Type: UnicodeDecodeError
Exception Value: ('ascii', '<RBACInstanceRoleSet: s2 | \xc3\x84\xc3\x96\xc3\x96\xc3\x85\xc3\x85\xc3\x85 Gruppen>]', 106, 107, 'ordinal not in range(128)')
Но если я делаю print list_of_groups
все выходит хороший на терминале
Так, мое понимание - то, что список начинает генерировать себя и делает repr () на всех его элементах, и они возвращают свои значения - в этом случае это должно быть 's2 | ÅÄÖÖ', затем список представляет себя как (ASCII, the-stuff-in-the-list) и затем при попытке Декодировать ASCII в unicode, это не будет, конечно, работать - так как один из элементов в списке имеет returened u'...' себя, когда repr был сделан на нем.
Но почему это????´
И почему вещи работают, и unicode/ascii обрабатывается правильно каждый раз, когда я регистрирую простые вещи как group.name и так или группа, и unicode методы называют. Каждый раз, когда я становлюсь ленивым и хочу зарегистрировать список, набор или другие вещи разлагаются каждый раз, когда с unicode символом встречаются...
Еще некоторые примеры та работа и сбой. Если group.name
Я перехожу к образцовому полю и group
вызовы __unicode__()
logging.debug("1. group: %s " % group.name) # WORKS
logging.debug(u"2. group: %s " % group) # WORKS
logging.debug("3. group: %s " % group) # FAILS
logging.debug(u"4. group: %s " % group.name) # WORKS
logging.debug("5. group: %s " % group.name) # WORKS
... и я действительно думал, что у меня была власть на Unicode; - (
Я не могу воспроизвести вашу проблему простым тестом:
Python 2.6.4 (r264:75706, Dec 7 2009, 18:45:15) [GCC 4.4.1] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import logging >>> group = u'Luleå' >>> logging.warning('Group: %s', group) WARNING:root:Group: Luleå >>> logging.warning(u'Group: %s', group) WARNING:root:Group: Luleå >>>
Итак, так как говорит Даниэль, наверное, что-то не является правильным Unicode в том, что вы проходите к регистрации.
Кроме того, я не знаю, какие обработчики вы используете, но убедитесь, что есть ли обработчики файлов, которые вы явно указываете выходные кодировки для использования, и если есть обработчики для потоков, вы также обертываете любой выходной поток, который требует его С кодировкой, такими как модуль модулем
(и пройти завернутый поток для регистрации).
Я не понимаю, что это так, вы не понимаете, если вы видите, что я имею в виду. Ваш сопоставленный абзац:
Итак, мое понимание состоит в том, что список начинает генерировать себя и делает RAP () на все его элементы, и они возвращают свои значения - в этом случае он должен быть «S2 | Åäöö ... ', затем список представляет себя как (ASCII, The-the-in-in-списка), а затем при попытке декодировать ASCII в Unicode это будет, конечно, не работать - поскольку один из элементов в списке смягчается А ты «...» сам по себе, когда республика было сделано на нем.
Объясняет именно то, что происходит - вывод списка не совпадает с печатью всех его элементов, поскольку под капотом все это произойдет, является вызовите REPR () на каждом элементе в списке. Вместо того, чтобы выводить список необработанного списка, вы можете воспользоваться пониманием списка, который вызывает Unicode на каждом элементе, который его исправит.
Я закончил следующим советам в качестве ответа и переходе над всем кодом и выполнением списка или подобное при попытке регистрации набора / списка / DICK / DJANGOSE. Поэтому адаптация и добавление таких вещей, как это решило для меня:
logging.debug(u"new groups: %s" % [unicode(g) for g in list_of_groups])
Так что теперь все, что я должен сделать, это помнить, что никогда не забывать делать это; -)
Попробуйте использовать этот код в верхней части файла views.py
#-*- coding: utf-8 -*-
...
пробовали ли вы вручную сделать какой-либо результат юникодом?
logging.debug(u'new groups %s' % unicode(list_of_groups("UTF-8"))