Я уже два дня изучаю юникод и его реализацию на Python, и думаю, что я понимаю, о чем он. Просто чтобы быть уверенным, я спрашиваю, верны ли мои предположения относительно моих текущих проблем.
В Django формы дают мне юникодные строки, которые я подозреваю, что они "сломаны" Unicode-строки в Python должны быть закодированы в UTF-8, верно? После ввода строки "fähre" в текстовое поле браузер отправляет строку "f% c3% a4hre" в запросе POST (проверяется с помощью wireshark). Когда я получаю значение через form.cleaned_data, я получаю строку u'f \ xa4hre '(обратите внимание, что это строка в кодировке Unicode). Насколько я понимаю, это Unicode-строка в кодировке ISO-8859-1, что неверно. Правильная строка должна быть u'f \ xc3 \ xa4hre ', которая будет строкой Unicode в кодировке UTF-8. Это ошибка в Django или в моем понимании что-то не так?
Чтобы решить эту проблему, я написал функцию для применения к любому вводу текста из форм Django:
def fix_broken_unicode(s):
return unicode(s.encode(u'utf-8'), u'iso-8859-1')
что делает
>>> fix_broken_unicode(u'f\xa4hre')
u'f\xc3\xa4hre'
Это не кажется мне очень элегантным, но установка параметров Django.DEFAULT_CHARSET в значение 'utf-8' не помогла, как и ничего другого. Я пытаюсь работать с юникодом по всему приложению, чтобы потом не было никаких странных ошибок, но этого явно недостаточно, чтобы пометить все строки как '...'.
Редактировать: Учитывая ответы Дирка и STH, теперь я сохраню строки в базе данных, как они есть. Реальная проблема заключалась в том, что я пытался кодировать эти типы строк, чтобы использовать их в качестве входных данных для API Twitter и т. Д. Однако в запросах GET или POST, очевидно, ожидается кодирование UTF-8, что делает стандартная функция urllib.urlencode () не обрабатывается правильно (выбрасывает исключения). Посмотрите на мое решение в pastebin и не стесняйтесь комментировать его.