django UnicodeDecodeError:'utf8' 编解码器无法解码字节 0xe9 在位置 87:无效的后续字节

2 投票
3 回答
5824 浏览
提问于 2025-04-18 01:02

我在用 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 个回答

0

一个原因是,你之前用过这样的命令,把 sedgrep 一起用了:

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

0

你可以试试:

manage.py dbshell
ALTER TABLE database.table MODIFY COLUMN col VARCHAR(255)  CHARACTER SET utf8 COLLATE
utf8_general_ci NOT NULL;

把数据库、表和列换成你需要的。
祝你好运!

0

根据错误信息的追踪(也就是你应该查看问题根源的地方),在 if ending and not msg.endswith(ending): 这一行中,msg 可能有些问题(因为 ending 的长度不太可能有87个字符)。这很可能是因为 msg 里面有些内容不是有效的utf-8编码。这可能是设置文件或者输入参数的编码问题。

我建议你:

  • 在PDB(Python调试器)下运行整个程序,看看 msg 的值,或者在出错的那一行之前加上调试打印 repr(msg) 来查看内容
  • 追踪一下这些错误数据的来源。很可能是开发者在检查输入数据时疏忽了。

撰写回答