Python/Flask:UnicodeCodeError/UnicodeCodeError:';ascii';编解码器可以';t解码/编码

Python/Flask:UnicodeCodeError/UnicodeCodeError:';ascii';编解码器可以';t解码/编码,python,unicode,utf-8,flask,psycopg2,Python,Unicode,Utf 8,Flask,Psycopg2,对于第一百万个关于这个的问题,我感到抱歉,但是我已经读了很多关于这个主题的书,但是仍然没有修复这个错误(所有这些都是新手)。 我正试图用flask(使用Ubuntu 16.04/python 2.7.12)在网站上显示postgres表的内容。表中有非ascii字符(在本例中为'u',结果是UnicodeDecodeError:'ascii'编解码器无法解码位置2:序号不在范围(128)中的字节0xc3 这就是我的init.py的外观: #-*- coding: utf-8 -*

对于第一百万个关于这个的问题,我感到抱歉,但是我已经读了很多关于这个主题的书,但是仍然没有修复这个错误(所有这些都是新手)。 我正试图用flask(使用Ubuntu 16.04/python 2.7.12)在网站上显示postgres表的内容。表中有非ascii字符(在本例中为'u',结果是UnicodeDecodeError:'ascii'编解码器无法解码位置2:序号不在范围(128)中的字节0xc3

这就是我的init.py的外观:

        #-*- coding: utf-8 -*-

from flask import Blueprint, render_template
import psycopg2
from .forms import Form
from datetime import datetime
from .table import Item, ItemTable

test = Blueprint('test', __name__)

def init_test(app):
    app.register_blueprint(test)

def createTable(cur):
    cmd = "select * from table1 order by start desc;"
    cur.execute(cmd)
    queryResult = cur.fetchall()
    items = []
    table = 'table could not be read'
    if queryResult is not None:         
        for row in range(0, len(queryResult)):
        items.append(Item(queryResult[row][0], queryResult[row][1].strftime("%d.%m.%Y"), queryResult[row][2].strftime("%d.%m.%Y"), \
                          queryResult[row][1].strftime("%H:%M"), queryResult[row][2].strftime("%H:%M"), \
                          queryResult[row][3], queryResult[row][4], queryResult[row][5], queryResult[row][6]))
        table = ItemTable(items)
    return table


@test.route('/test')
def index():
    dbcon = psycopg2.connect("dbname=testdb user=postgres host=localhost")
    cur = dbcon.cursor()
    table = createTable(cur)
    cur.close()
    return render_template('test_index.html', table=table)
和html文件的一部分:

{% extends "layout.html" %}
{% block head %}Title{% endblock %}
{% block body %}
<script type="text/javascript" src="{{ url_for('static', filename='js/bootstrap.js') }}"></script>
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/custom.css') }}">
<div class="row" id="testid">
    {{table}}
</div>
{% endblock %}{#
Local Variables:
coding: utf-8
End: #}

为了强制结果为unicode(queryResult[row][6]的类型返回类型为“unicode”),因为正如建议的那样,我尝试在任何地方都使用unicode。这导致了UnicodeEncodeError:“ascii”编解码器无法对位置2的字符u'\xfc'进行编码:序号不在范围内(128)。 然后我想,以前转换成字符串(字节)可能出了问题,然后我试着自己写

queryResult[row][6].encode('utf-8', 'replace')
这导致UnicodeDecodeError:“ascii”编解码器无法解码位置2:序号不在范围(128)中的字节0xc3。甚至没有使用“忽略”而不是“替换”。 这是怎么回事?我通过创建并传递一个变量v=u'ü来检查render_template()是否与unicode有问题,但这没有问题,并且显示正确。是的,我阅读了通常推荐的东西,比如nedbatcheld.com/text/unipain.html和Unicode Demystified,但这并没有帮助我解决我的问题,我显然遗漏了一些东西

以下是第一个UnicodeDecodeError的回溯:

File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 2000, in __call__
return self.wsgi_app(environ, start_response)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1991, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1567, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1988, in wsgi_app
response = self.full_dispatch_request()
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1641, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1544, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request
rv = self.dispatch_request()
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/name/Desktop/testFlask/app/test/__init__.py", line 95, in index
return render_template('test_index.html', table=table) #, var=var
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/templating.py", line 134, in render_template
context, ctx.app)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/templating.py", line 116, in _render
rv = template.render(context)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/jinja2/environment.py", line 989, in render
return self.environment.handle_exception(exc_info, True)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/jinja2/environment.py", line 754, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/name/Desktop/testFlask/app/templates/test_index.html", line 1, in top-level template code
{% extends "layout.html" %}
File "/home/name/Desktop/testFlask/app/templates/layout.html", line 40, in top-level template code
{% block body %}{% endblock %}
File "/home/name/Desktop/testFlask/app/templates/test_index.html", line 7, in block "body"
{{table}}
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask_table/table.py", line 86, in __html__
tbody = self.tbody()
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask_table/table.py", line 103, in tbody
out = [self.tr(item) for item in self.items]
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask_table/table.py", line 120, in tr
''.join(c.td(item, attr) for attr, c in self._cols.items()
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask_table/table.py", line 121, in <genexpr>
if c.show))
File "/home/name/Desktop/testFlask/app/test/table.py", line 7, in td
self.td_contents(item, self.get_attr_list(attr)))
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask_table/columns.py", line 99, in td_contents
return self.td_format(self.from_attr_list(item, attr_list))
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask_table/columns.py", line 114, in td_format
return Markup.escape(content)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/markupsafe/__init__.py", line 165, in escape
rv = escape(s)
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask/app.py”,第2000行,调用__
返回self.wsgi_应用程序(环境,启动响应)
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask/app.py”,第1991行,在wsgi_应用程序中
响应=self.make\u响应(self.handle\u异常(e))
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask/app.py”,第1567行,在handle_异常中
重放(exc_类型、exc_值、tb)
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask/app.py”,第1988行,在wsgi_应用程序中
response=self.full\u dispatch\u request()
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask/app.py”,第1641行,完整发送请求
rv=自身处理用户异常(e)
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask/app.py”,第1544行,在handle\u user\u exception中
重放(exc_类型、exc_值、tb)
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask/app.py”,第1639行,完整发送请求
rv=自我分派请求()
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask/app.py”,第1625行,在调度请求中
返回self.view_函数[rule.endpoint](**req.view_参数)
文件“/home/name/Desktop/testFlask/app/test/_init__.py”,第95行,索引中
返回render_模板('test_index.html',table=table)#,var=var
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask/templating.py”,第134行,位于render_模板中
上下文(ctx.app)
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask/templating.py”,第116行,在
rv=template.render(上下文)
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/jinja2/environment.py”,第989行,在渲染中
返回self.environment.handle\u异常(exc\u info,True)
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/jinja2/environment.py”,第754行,在handle\u异常中
重放(exc_类型、exc_值、tb)
顶级模板代码中的文件“/home/name/Desktop/testFlask/app/templates/test_index.html”,第1行
{%extends“layout.html”%}
顶级模板代码中的文件“/home/name/Desktop/testFlask/app/templates/layout.html”,第40行
{%block body%}{%endblock%}
文件“/home/name/Desktop/testFlask/app/templates/test_index.html”,第7行,在“body”块中
{{table}}
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask_table/table.py”,第86行,在html中__
tbody=self.tbody()
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask_table/table.py”,第103行,在tbody中
out=[self.tr(item)表示self.items中的项]
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask_table/table.py”,第120行,在tr中
''.join(c.td(item,attr)代表attr,c在self.\u cols.items()
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask_table/table.py”,第121行,在
如果c.show)
文件“/home/name/Desktop/testFlask/app/test/table.py”,第7行,td格式
self.td_内容(项、self.get_属性列表(attr)))
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask_table/columns.py”,第99行,td_目录
返回self.td_格式(self.from_attr_列表(项目,attr_列表))
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/flask_table/columns.py”,第114行,td_格式
返回标记.escape(内容)
文件“/home/name/Desktop/testFlask/venv/lib/python2.7/site packages/markupsafe/_init__.py”,第165行,在escape中
rv=逃生

非常感谢您的帮助……

因为在Python 2中字节码是不强制执行的,您可能会对它们感到困惑。 据我所知,从字符串到字节码再到反向编码,编码和解码都是有效的。因此,如果您的结果集是一个字符串,则无需再次对其进行编码。 如果对“§”这样的特殊字符有错误的表示,我会尝试以下方法:

报告(查询结果[行][6])


这行得通吗?

因为在Python2中字节码是不强制的,人们可能会对它们感到困惑。 据我所知,从字符串到字节码再到反向编码,编码和解码都是有效的。因此,如果您的结果集是一个字符串,则无需再次对其进行编码。 如果对“§”这样的特殊字符有错误的表示,我会尝试以下方法:

报告(查询结果[行][6])

是吗
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 2000, in __call__
return self.wsgi_app(environ, start_response)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1991, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1567, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1988, in wsgi_app
response = self.full_dispatch_request()
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1641, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1544, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request
rv = self.dispatch_request()
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/name/Desktop/testFlask/app/test/__init__.py", line 95, in index
return render_template('test_index.html', table=table) #, var=var
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/templating.py", line 134, in render_template
context, ctx.app)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask/templating.py", line 116, in _render
rv = template.render(context)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/jinja2/environment.py", line 989, in render
return self.environment.handle_exception(exc_info, True)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/jinja2/environment.py", line 754, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/name/Desktop/testFlask/app/templates/test_index.html", line 1, in top-level template code
{% extends "layout.html" %}
File "/home/name/Desktop/testFlask/app/templates/layout.html", line 40, in top-level template code
{% block body %}{% endblock %}
File "/home/name/Desktop/testFlask/app/templates/test_index.html", line 7, in block "body"
{{table}}
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask_table/table.py", line 86, in __html__
tbody = self.tbody()
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask_table/table.py", line 103, in tbody
out = [self.tr(item) for item in self.items]
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask_table/table.py", line 120, in tr
''.join(c.td(item, attr) for attr, c in self._cols.items()
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask_table/table.py", line 121, in <genexpr>
if c.show))
File "/home/name/Desktop/testFlask/app/test/table.py", line 7, in td
self.td_contents(item, self.get_attr_list(attr)))
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask_table/columns.py", line 99, in td_contents
return self.td_format(self.from_attr_list(item, attr_list))
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/flask_table/columns.py", line 114, in td_format
return Markup.escape(content)
File "/home/name/Desktop/testFlask/venv/lib/python2.7/site-packages/markupsafe/__init__.py", line 165, in escape
rv = escape(s)
col_6 = queryResult[row][6].decode('utf-8')
Item(..., ..., col_6, ...)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
class customCol(Col):
def td(self, item, attr):
    return '<td><div id="beschrCol">{}</div></td>'.format(
        self.td_contents(item, self.get_attr_list(attr)))
def td(self, item, attr):
    return u'<td><div id="beschrCol">{}</div></td>'.format...
queryResult[row][6].decode('utf-8')