django UnicodeDecodeError:'utf8' 编解码器无法解码字节 0xe9 在位置 87:无效的后续字节
我在用 Aptana Studio 3 做一个 Django 项目时,遇到了一个 Unicode 解码错误,不管我怎么尝试都没法解决。
我在网上搜索了很多次都没找到答案,最后试了一个非常简单的 Django 项目。这个项目里没有我写的任何代码,完全是 Aptana 生成的起始代码。
我本来以为会看到 Django 的空白页面(项目正常运行,但什么都没做),结果还是出现了编码错误。我根本没有写过一行代码,所以也没有模板里有拉丁字符或其他编码/解码的问题。
我尝试了以下方法:
在 Windows 菜单里选择 -> 偏好设置 -> 一般 -> 工作区 -> 文本文件编码,设置为 UTF-8
右键点击项目 -> 资源 -> 文本文件编码,设置为 UTF-8
# -- coding: utf-8 -- 加在每个文件的第一行
但都没用。
我现在有点无助了。有没有人能帮帮我?
我的系统是 Win7 64位
控制台显示的错误信息:
Validating models...
0 errors found
April 02, 2014 - 17:55:34
Django version 1.6, using settings 'hello.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
Traceback (most recent call last):
File "C:\Users\bruna\Documents\Aptana Studio 3 Workspace\hello\src\manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 399, in execute_from_command_line
utility.execute()
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 392, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 242, in run_from_argv
self.execute(*args, **options.__dict__)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 285, in execute
output = self.handle(*args, **options)
File "C:\Python27\lib\site-packages\django\core\management\commands\runserver.py", line 76, in handle
self.run(*args, **options)
File "C:\Python27\lib\site-packages\django\core\management\commands\runserver.py", line 87, in run
self.inner_run(*args, **options)
File "C:\Python27\lib\site-packages\django\core\management\commands\runserver.py", line 132, in inner_run
self.stderr.write("Error: %s" % error_text)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 65, in write
if ending and not msg.endswith(ending):
File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 87: invalid continuation byte
3 个回答
一个原因是,你之前用过这样的命令,把 sed
和 grep
一起用了:
sed -i "s#views_gaoji#fenye#g"
grep -rl views_gaoji ./`
这个命令会在你不知道的情况下修改 .pyc 文件。
然后当你启动 Django 时,Django 会从 .pyc 文件开始,而不是从你的工程文件开始。
这样你可能会遇到错误,却不知道错误出在哪里,
或者你会在 manage.py
文件里看到错误,但你根本没有修改过这个文件,
那么为什么会说你的 manage.py 有错误呢?
---------------------------------------------------------------------
这是因为你的 *.pyc 文件被 sed
命令修改了。
解决办法:
find . -name "*.pyc" | xargs rm -f
然后输入:
python manage.py runserver port
你可以试试:
manage.py dbshell
ALTER TABLE database.table MODIFY COLUMN col VARCHAR(255) CHARACTER SET utf8 COLLATE
utf8_general_ci NOT NULL;
把数据库、表和列换成你需要的。
祝你好运!
根据错误信息的追踪(也就是你应该查看问题根源的地方),在 if ending and not msg.endswith(ending):
这一行中,msg
可能有些问题(因为 ending
的长度不太可能有87个字符)。这很可能是因为 msg
里面有些内容不是有效的utf-8编码。这可能是设置文件或者输入参数的编码问题。
我建议你:
- 在PDB(Python调试器)下运行整个程序,看看
msg
的值,或者在出错的那一行之前加上调试打印repr(msg)
来查看内容 - 追踪一下这些错误数据的来源。很可能是开发者在检查输入数据时疏忽了。