Проблема при использовании Python, входящего в систему django и unicode

полностью перепутанный к настоящему времени... Я разрабатываю в 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; - (

7
задан jenlu 21 January 2010 в 18:22
поделиться

5 ответов

Я не могу воспроизвести вашу проблему простым тестом:

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 в том, что вы проходите к регистрации.

Кроме того, я не знаю, какие обработчики вы используете, но убедитесь, что есть ли обработчики файлов, которые вы явно указываете выходные кодировки для использования, и если есть обработчики для потоков, вы также обертываете любой выходной поток, который требует его С кодировкой, такими как модуль модулем (и пройти завернутый поток для регистрации).

1
ответ дан 7 December 2019 в 14:33
поделиться

Я не понимаю, что это так, вы не понимаете, если вы видите, что я имею в виду. Ваш сопоставленный абзац:

Итак, мое понимание состоит в том, что список начинает генерировать себя и делает RAP () на все его элементы, и они возвращают свои значения - в этом случае он должен быть «S2 | Åäöö ... ', затем список представляет себя как (ASCII, The-the-in-in-списка), а затем при попытке декодировать ASCII в Unicode это будет, конечно, не работать - поскольку один из элементов в списке смягчается А ты «...» сам по себе, когда республика было сделано на нем.

Объясняет именно то, что происходит - вывод списка не совпадает с печатью всех его элементов, поскольку под капотом все это произойдет, является вызовите REPR () на каждом элементе в списке. Вместо того, чтобы выводить список необработанного списка, вы можете воспользоваться пониманием списка, который вызывает Unicode на каждом элементе, который его исправит.

0
ответ дан 7 December 2019 в 14:33
поделиться

Я закончил следующим советам в качестве ответа и переходе над всем кодом и выполнением списка или подобное при попытке регистрации набора / списка / DICK / DJANGOSE. Поэтому адаптация и добавление таких вещей, как это решило для меня:

logging.debug(u"new groups: %s" % [unicode(g) for g in list_of_groups])

Так что теперь все, что я должен сделать, это помнить, что никогда не забывать делать это; -)

0
ответ дан 7 December 2019 в 14:33
поделиться

Попробуйте использовать этот код в верхней части файла views.py

#-*- coding: utf-8 -*-
...
1
ответ дан 7 December 2019 в 14:33
поделиться

пробовали ли вы вручную сделать какой-либо результат юникодом?

logging.debug(u'new groups %s' % unicode(list_of_groups("UTF-8"))
0
ответ дан 7 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: