Юникод в 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++:
- Перейдите в Настройки -> Настройки...
- Выберите вкладку «Новый документ/Папка по умолчанию»
- Выберите кодировку «UTF-8 без BOM»
Также рекомендуется использовать формат Unix-строк, вы можете выбрать его в той же панели, но это необязательно.
© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/0.12.x/unicode/