磅符号不显示Jinja2(编码)

时间:2018-07-03 22:45:57

标签: python flask

我在数据库中的值如下:

£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 :(得分:1)

Python 2在处理unicode时非常棘手,因为它仅本地处理二进制文件。因此,您的英镑符号已编码并存储在数据库中。您可以像这样检索它:

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

因此可以在两个地方处理这种编码和解码:

在存储数据之前。如果对数据进行编码,则在保存数据时,渲染不会出现问题。这样的东西(伪代码):

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)

选择一个将更便于您实现的方法。