Почему в Django возникают проблемы со строками в кодировке utf-8? - PullRequest
0 голосов
/ 11 марта 2012

Я немецкий разработчик, пишущий веб-приложения для немцев, что означает, что я ни в коем случае не могу полагаться на простое кодирование ASCII.По крайней мере, такие символы, как ä, ö, ü, ß должны поддерживаться.

К счастью, Django рассматривает ByteStrings как utf-8, закодированный по умолчанию (как описано в документах ).Так что это должно сработать, если я добавлю строку # -*- coding: utf-8 -*- в начало каждого файла .py и установлю кодировку редактора, не так ли?Ну, это происходит в большинстве случаев ...

Но мне кажется, что-то не хватает, когда дело доходит до URL.Или, может быть, это не имеет ничего общего с URL-адресами, но до сих пор я не заметил какого-либо другого нарушения кодировки.В качестве примеров я могу вспомнить два случая:

Шаблон URL url(r'^([a-z0-9äöüß_\-]+)/$', views.view_page) вообще не распознает URL, содержащие ä, ö, ü, ß.Эти символы просто игнорируются.

Следующий код функции представления вызывает исключение:

def do_redirect(request, id):
    return redirect('/page/{0}'.format(id))

Где аргумент id захватывается из URL, как в первом примере.Если я исправлю шаблон URL (указав его в виде строки Unicode) и получу доступ /ä/, я получу исключение

UnicodeEncodeError at /ä/
'ascii' codec can't encode character u'\xe4' in position 0: ordinal not in range(128)

Однако, пробуя следующий код для функции представления:

def do_redirect(request, id):
    return redirect('/page/' + id)

все отлично работает.Это заставляет меня поверить, что настоящая проблема заключается не в Django, а в Python, трактующем ByteStrings как ASCII.Я не сильно увлекаюсь кодированием, но проблема во втором примере, очевидно, заключается в методе format () объекта String.Итак, в первом примере он может потерпеть неудачу из-за того, как Python обрабатывает регулярные выражения (хотя я не знаю, использует ли Django модуль re или что-то еще).

Мой обходной путь до сих пор - просто добавление строкис u всякий раз, когда возникает такая ошибка.Это плохое решение, так как я могу легко что-то упустить.Я пытался пометить каждую строку Python как Unicode, но это вызывает другие исключения и довольно уродливо.

Кто-нибудь точно знает, в чем проблема и как ее решить приятным способом (то есть способом, который непусть ваша голова взорвется, когда код станет больше)?

Заранее спасибо!

РЕДАКТИРОВАТЬ: Для моего регулярного выражения я выяснил, зачем нужен u.Указание строки в виде необработанной строки (r) делает ее интерпретируемой как ASCII.Отсутствие r заставляет регулярное выражение работать без u, но приводит к некоторой головной боли с обратными слешами.

Ответы [ 2 ]

5 голосов
/ 11 марта 2012

Префикс вашей строки с u является решением.

Если это проблема для вас, то это выглядит как симптом более общей проблемы: в вашем коде много магических констант . Это плохо (и вы уже понимаете, почему). Старайтесь избегать их, например, вы можете использовать именованный шаблон URL или имя представления для перенаправления вместо повторного ввода части URL.

Если вы не можете избежать их, превратите их в именованные константы и разместите их назначения в одном месте. Затем вы увидите, что все они имеют префикс должным образом, и это будет трудно игнорировать.

1 голос
/ 11 марта 2012

В django 1.4 одной из новых функций является улучшенная поддержка интернационализация URL , включая поддержку перевода URL-адресов.

Это может помочь вам, ноне означает, что вы должны игнорировать другой совет, так как он относится к Python в целом и относится к всему , а не только к django.

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