这两天处理数据,从数据库获取数据,用python的MySQLdb。但是中文总是出现乱码。
在此做个小结
1.mysql编码(网上资料太多自行搜索之)
2.python默认编码
开始只是改了mysql端的编码,改为UTF8,发现问题依旧。比如:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa1 in position xxx...
这是由于python默认编码是ASCII,故需要设置为UTF-8。使用sys中的setdefaultencoding方法:
import sys
sys.setdefaultencoding('utf8')
然而会报错:
AttributeError: 'module' object has no attribute 'setdefaultencoding'
百度google之后,发现sys.setdefaultencoding 方法在python导入 site.py 后就删除了,不能再被调用了。
site.py源码:https://hg.python.org/cpython/file/2.7/Lib/site.py#l545
注意看main函数最后几行
if hasattr(sys, "setdefaultencoding"):
del sys.setdefaultencoding
site.py 是 python 解释器启动后,默认加载的一个脚本。如果使用 python -S 启动的话,将不会自动加载 site.py。
只能重新reload(sys)一下。于是:
import sys
reload(sys)
sys.setdefaultencoding('utf8')
如何简化,不用每次添加这几行。
增加一个名为 sitecustomize.py,推荐存放的路径为 site-packages 目录下。sitecustomize.py 是在 site.py 被import 执行的,因为 sys.setdefaultencoding() 是在 site.py 的结尾处被删除的,所以,可以在 sitecustomize.py 使用 sys.setdefaultencoding()。
#file name: sitecustomize.py
import sys
sys.setdefaultencoding('utf-8')
既然 sitecustomize.py 能在python启动时被自动加载, 所以除了设置编码外,也可以设置一些其他的东西。
3.源代码编码
习惯性以这个开头即可
# -*- coding:utf-8 -*-
4.unicode中混杂u'\xa0'
该问题是由于源数据中混杂不同编码的空格,如果直接输出到文件不会出问题,但是命令行输出,或者进行转码操作会报如下错误:
UnicodeEncodeError: 'gbk' codec can't encode character u'\xa0' in position xxx:illegal multibyte sequence
如果将其中的unicode串u'\xa0'替换正常了。
us.replace(u'\xa0', u' ')
其中us是一个unicode串
其实unicode自带方法.strip()可以直接去掉'\xa0'这样的空格