我在数据库中的值如下:
£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。
答案 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)
选择一个将更便于您实现的方法。