Python UnicodeEncodeError和xFF1A';拉丁语-1';编解码器可以';对位置0-1中的字符进行t编码:序号不在范围内(256)
我是python的新手。今天当我编写一些搜索函数时,我遇到了一个错误。我使用sqlalchemy orm来实现这一点,在我的函数中,我输入了一个中文单词作为关键字。html页面在/user/search处给我一个Unicodeincoder错误:“latin-1”编解码器无法对位置0-1的字符进行编码:序号不在范围内(256)。 我的代码是这样的:Python UnicodeEncodeError和xFF1A';拉丁语-1';编解码器可以';对位置0-1中的字符进行t编码:序号不在范围内(256),python,django,sqlalchemy,mysql-python,latin1,Python,Django,Sqlalchemy,Mysql Python,Latin1,我是python的新手。今天当我编写一些搜索函数时,我遇到了一个错误。我使用sqlalchemy orm来实现这一点,在我的函数中,我输入了一个中文单词作为关键字。html页面在/user/search处给我一个Unicodeincoder错误:“latin-1”编解码器无法对位置0-1的字符进行编码:序号不在范围内(256)。 我的代码是这样的: def user_search(request): name = request.GET.get('name').strip() u
def user_search(request):
name = request.GET.get('name').strip()
user_list = list()
if name:
user_list = User.get_by_name(name)
class User(object):
@classmethod
def get_by_name(cls, name):
return DBSession.query(cls).filter(cls.name==name)
追溯到这里:
Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/home/jiankong/git/admin-server/lib/decorators.py" in wrapper
75. return func(request, *args, **kwargs)
File "/home/jiankong/git/admin-server/lib/decorators.py" in wrapper
39. output = function(request, *args, **kwargs)
File "/home/jiankong/git/admin-server/apps/user/user_views.py" in user_search
47. users = jump_page(paginator, page)
File "/home/jiankong/git/admin-server/apps/user/utils.py" in jump_page
92. return paginator.page(1)
File "/usr/local/lib/python2.6/dist-packages/django/core/paginator.py" in page
37. number = self.validate_number(number)
File "/usr/local/lib/python2.6/dist-packages/django/core/paginator.py" in validate_number
28. if number > self.num_pages:
File "/usr/local/lib/python2.6/dist-packages/django/core/paginator.py" in _get_num_pages
60. if self.count == 0 and not self.allow_empty_first_page:
File "/usr/local/lib/python2.6/dist-packages/django/core/paginator.py" in _get_count
48. self._count = self.object_list.count()
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in count
2414. return self.from_self(col).scalar()
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in scalar
2240. ret = self.one()
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in one
2209. ret = list(self)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in __iter__
2252. return self._execute_and_instances(context)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in _execute_and_instances
2267. result = conn.execute(querycontext.statement, self._params)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/engine/base.py" in execute
664. params)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/engine/base.py" in _execute_clauseelement
764. compiled_sql, distilled_params
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/engine/base.py" in _execute_context
871. context)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/engine/default.py" in do_execute
324. cursor.execute(statement, parameters)
File "/usr/local/lib/python2.6/dist-packages/MySQL_python-1.2.4-py2.6-linux-i686.egg/MySQLdb/cursors.py" in execute
183. query = query % db.literal(args)
File "/usr/local/lib/python2.6/dist-packages/MySQL_python-1.2.4-py2.6-linux-i686.egg/MySQLdb/connections.py" in literal
264. return self.escape(o, self.encoders)
File "/usr/local/lib/python2.6/dist-packages/MySQL_python-1.2.4-py2.6-linux-i686.egg/MySQLdb/connections.py" in unicode_literal
202. return db.literal(u.encode(unicode_literal.charset))
Exception Type: UnicodeEncodeError at /user/search
Exception Value: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)`
当我遇到错误时,我在python shell中做了一个测试,效果很好,代码如下:
从apps.user.models导入用户
user=user.get\u by\u name('某人').第一()
打印用户
打印用户名
某人
那么,我该怎么做才能让它在我的html页面中工作呢?非常感谢!!基于您的stacktrace,您正在使用开启unicode编码的MySQL Python,因为它正在进行编码。因此您可能需要指定一个可适配的编码(请注意,这是MySQLdb DBAPI使用的所有设置,SQLalhcemy只是传递它们):
我假设您正在使用MySQL和MySQLdb驱动程序 MySQLdb驱动程序使用的默认编码是latin-1,它不支持您的字符集。您需要使用UTF-8(或其他,但UTF-8是最常见的)才能通过MySQLdb与数据库通信(请参阅) 要执行此操作,请使用以下行创建引擎:
create_engine('mysql+mysqldb://USER:@SERVER:PORT/DB?charset=utf8', encoding='utf-8')
您还可以使用sqlalchemy.engine.url.url
类构造引擎url,并将其发送到create engine
函数。我发现在配置文件中设置时它很有用
import sqlalchemy.engine.url as url
engine_url = url.URL(
drivername='mysql+' + cfg['MYSQL_PYTHON_DRIVER'],
host=cfg['MYSQL_HOST'],
port=cfg['MYSQL_PORT'],
username=cfg['MYSQL_USER'],
password=cfg['MYSQL_PWD'],
database=cfg['MYSQL_DB'],
query={'charset': 'utf8'}
)
db = create_engine(engine_url, encoding='utf-8')
希望对您有所帮助。我猜
User.name的类型是String?请尝试将其更改为Unicode。
import sqlalchemy.engine.url as url
engine_url = url.URL(
drivername='mysql+' + cfg['MYSQL_PYTHON_DRIVER'],
host=cfg['MYSQL_HOST'],
port=cfg['MYSQL_PORT'],
username=cfg['MYSQL_USER'],
password=cfg['MYSQL_PWD'],
database=cfg['MYSQL_DB'],
query={'charset': 'utf8'}
)
db = create_engine(engine_url, encoding='utf-8')