Я немецкий разработчик, пишущий веб-приложения для немцев, что означает, что я ни в коем случае не могу полагаться на простое кодирование 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
, но приводит к некоторой головной боли с обратными слешами.