Spec-Zone.ru › Flask 0.12

Юникод в Flask

Flask, как и Jinja2 и Werkzeug, полностью основан на Юникоде, когда дело доходит до текста. Не только эти библиотеки, но и большинство веб-библиотек Python, которые работают с текстом. Если вы до сих пор не знакомы с Юникодом, вам, вероятно, следует прочитать Абсолютный минимум, который каждый разработчик ПО должен знать о Юникоде и наборах символов. Эта часть документации просто пытается охватить самые основы, чтобы вы получили приятный опыт работы с Юникодом.

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

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы перейти от Юникода к определённому набору символов, например 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: либо используйте кодовый маркер кодировки, либо поместите это в ваш .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/0.12.x/unicode/

Spec-Zone.ru

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