Знак фунта не отображает Jinja2 (кодировка) - PullRequest
0 голосов
/ 04 июля 2018

Мое значение в базе данных выглядит так:

£40

Это часть более длинного предложения, на случай, если кто-нибудь спросит, почему я его так храню.

Когда я отрисовываю текст (Flask / Jinja2 / Python2.7.9), я получаю это так:

\xc2\xa340

Почему это?

Моя функция вызова выглядит следующим образом:

def content_brief_metadata(self):
    try:
        self.cursor.execute("set names utf8;")
        self.cursor.execute('select title, description from metadata')
        return self.cursor.fetchall()
    except Exception as e:
        return e
    finally:
        self.db.close()

Я просто передаю данные в шаблон и все.

У меня также есть кодировка шаблона для utf-8.

1 Ответ

0 голосов
/ 04 июля 2018

Python 2 сложен при работе с юникодом, поскольку изначально обрабатывает только двоичные файлы. Таким образом, ваш символ фунта был закодирован и сохранен в БД. Вы можете получить его так:

>>> '\xc2\xa340'.decode('utf-8')
u'\xa340'
>>> print('\xc2\xa340'.decode('utf-8'))
£40

Таким образом, есть два места, где можно обрабатывать это кодирование и декодирование:

Перед сохранением данных. При сохранении данных, если вы их кодируете, тогда не будет проблем с рендерингом. Как то так (psuedocode):

cursor.execute('INSERT INTO metadata VALUES (%s, %s)', name.encode('utf-8), description.encode('utf-8'))

Или вы можете декодировать двоичный файл после получения данных и перед отправкой в ​​функцию render_template:

name = result[0].decode('utf-8')
description = result[0].decode('utf-8')
return render_template('template.html', name=name, desc=description)

Выберите тот, который будет более удобным для вашей реализации.

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