DjangoUnicodeDecodeError utf8编码错误解决办法

昨天和同事一起着了一个编码问题的,错误是分场景的
本次错误的场景描述:同事上网找了一个vim编辑器的配置文件。在使用中一直正常,今天编辑代码中包含中文,moldes中的别名,在admin保存的时候,报错如下:

DjangoUnicodeDecodeError at /admin/meeting/works/add/
'utf8' codec can't decode byte 0xd7 in position 0: invalid continuation byte. 
You passed in '\xd7\xf7\xc6\xb7\xc3\xfb\xb3\xc6' (<type 'str'>)

1.首先,先分析下这个错误。似乎 是说,编码问题。
先搞清’\xd7\xf7\xc6\xb7\xc3\xfb\xb3\xc6’ 是什么

print '\xd7\xf7\xc6\xb7\xc3\xfb\xb3\xc6' 
>>>??Ʒ????
#print乱码了。

2.会不会是数据库创建的时候,编码错误呢,查看了表以及库的编码,都是utf-8。问题不是出在数据。

3.查看本机的编码配置。

#查看本机器默认的encoding
>>> import sys
>>> sys.getdefaultencoding()
'ascii'

4.尝试用utf8解码。decode(‘utf-8’)或encode(‘utf8’)都尝试。

>>>s= '\xd7\xf7\xc6\xb7\xc3\xfb\xb3\xc6'
>>> print s.decode('utf-8').encode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd7 in position 0: invalid continuation byte
#这和页面报错没有区别,都是编码的问题

5.我们在网上找到类似问题,尝试在出现问题的编码中添加如下代码:

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

问题没有得到解决。
6.继续尝试,可能是settings文件中需要声明,文件默认编码:

FILE_CHARSET = 'utf-8'
DEFAULT_CHARSET = 'utf-8'
#仍然没有起作用

7.到底s= ‘\xd7\xf7\xc6\xb7\xc3\xfb\xb3\xc6’ 是什么呢?

#尝试用其他编码方式解码
str='\xd7\xf7\xc6\xb7\xc3\xfb\xb3\xc6'
>>> str = str.decode('gb2312')
>>> str
u'\u4f5c\u54c1\u540d\u79f0'
>>> print str
作品名称

嗯,问题可以确定了,中文的编码使用的是gb2312,而不是通用的utf8,这是为什么呢?
1)文件中我们已经添加了 # -- coding=UTF-8 -- 声明
2)文件头部,我们已经sys.setdefaultencoding(“utf-8”) (个人认为,来自于数据库编码问题,可以使用这种方法解决)
3)settings中,我们也声明了文件默认的编码

8.对,就是开头场景描述中,编辑器的问题
尝试使用其他编辑器打开已经编辑的编码,中文都显示为乱码。
找到vim的配置文件 vim .vimrc ,发现编码配置如下:

 60 set encoding=utf-8
 61 set termencoding=utf-8
 62 set fileencoding=utf-8
 63 set fileencodings=gb2312,utf-8,gbk,gb18030

63 行是什么意思呢?
参考:http://blog.csdn.net/sws9999/article/details/6088645

  • fileencodings: Vim自动探测fileencoding的顺序列表,启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。

解决办法:

 63 set fileencodings=utf-8,gbk,gb2312,gb18030

再次启动程序,可用了。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值