Spec-Zone.ru › Flask 1.1

Unicode в Flask

Flask, как Jinja2 и Werkzeug, полностью основан на Unicode, когда дело доходит до текста. Не только эти библиотеки, но и большинство веб-библиотек Python, работающих с текстом. Если вы до сих пор не знакомы с Unicode, вам следует прочитать The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets. Эта часть документации просто пытается охватить основы, чтобы вы получили приятный опыт работы с вещами, связанными с Unicode.

Автоматическое преобразование

Flask делает несколько предположений о вашем приложении (которые, конечно, можно изменить), что обеспечивает базовую и безболезненную поддержку Unicode:

  • кодировка текста на вашем веб-сайте — UTF-8
  • внутренне вы всегда будете использовать Unicode исключительно для текста, за исключением строковых литералов, содержащих только символы ASCII.
  • кодирование и декодирование происходит всякий раз, когда вы работаете с протоколом, требующим передачи байтов.

Что это значит для вас?

HTTP основан на байтах. Не только протокол, но и система адресации документов на серверах (так называемые URI или URL). Однако HTML, обычно передаваемый по HTTP, поддерживает множество кодировок символов, и какие из них используются, передаются в заголовке HTTP. Чтобы не усложнять ситуацию, Flask просто предполагает, что если вы отправляете Unicode, вы хотите, чтобы он был закодирован в UTF-8. Flask выполнит кодирование и установку соответствующих заголовков за вас.

То же самое относится к работе с базами данных с помощью SQLAlchemy или аналогичной системы ORM. Некоторые базы данных имеют протокол, который уже передаёт Unicode, а если нет, SQLAlchemy или ваша система ORM должна позаботиться об этом.

Золотое правило

Итак, правило: если вы не работаете с двоичными данными, работайте с Unicode. Что означает работа с Unicode в Python 2.x?

  • пока вы используете только символы ASCII (в основном цифры, некоторые специальные символы латинских букв без умляутов или чего-то подобного), вы можете использовать обычные строковые литералы ('Hello World').
  • если вам нужно что-то, кроме ASCII, в строке, вы должны пометить эту строку как строку Unicode, добавив префикс с маленькой буквы u. (как u'Hänsel und Gretel')
  • если вы используете не-Unicode символы в своих файлах Python, вы должны указать Python, какую кодировку использует ваш файл. Снова, я рекомендую UTF-8 для этой цели. Чтобы указать интерпретатору кодировку, вы можете поместить # -*- coding: utf-8 -*- в первую или вторую строку вашего исходного файла Python.
  • Jinja настроен на декодирование файлов шаблонов из UTF-8. Поэтому убедитесь, что ваш редактор также сохраняет файл как UTF-8.

Кодирование и декодирование самостоятельно

Если вы работаете с файловой системой или чем-то, что не основано на Unicode, вам необходимо убедиться, что вы правильно декодируете при работе с интерфейсом Unicode. Например, если вы хотите загрузить файл из файловой системы и встроить его в шаблон Jinja2, вам нужно декодировать его из кодировки этого файла. Здесь появляется старая проблема, что текстовые файлы не указывают свою кодировку. Поэтому окажите себе услугу и ограничьтесь UTF-8 для текстовых файлов тоже.

В любом случае. Чтобы загрузить такой файл с Unicode, вы можете использовать встроенный str.decode() метод:

def read_file(filename, charset='utf-8'):
    with open(filename, 'r') as f:
        return f.read().decode(charset)

Чтобы перейти от Unicode к определённой кодировке, например, UTF-8, вы можете использовать unicode.encode() метод:

def write_file(filename, contents, charset='utf-8'):
    with open(filename, 'w') as f:
        f.write(contents.encode(charset))

Настройка редакторов

Сейчас большинство редакторов по умолчанию сохраняют файлы в формате UTF-8, но если ваш редактор не настроен на это, вам нужно его изменить. Вот несколько распространённых способов настройки редактора для сохранения в формате UTF-8:

  • Vim: поместите set enc=utf-8 в свой .vimrc файл.
  • Emacs: либо используйте cookie кодировки, либо поместите это в свой .emacs файл:

    (prefer-coding-system 'utf-8)
    (setq default-buffer-file-coding-system 'utf-8)
    
  • Notepad++:

    1. Перейдите в Настройки -> Настройки…
    2. Выберите вкладку «Новый документ/Папка по умолчанию»
    3. Выберите кодировку «UTF-8 без BOM»

    Также рекомендуется использовать формат Unix-строк, вы можете выбрать его в той же панели, но это не обязательно.

© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/1.0.x/unicode/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API