天天看点

python编码处理

用python处理中文时,读取文件或消息,http参数等等

一运行,发现乱码(字符串处理,读写文件,print)

然后,大多数人的做法是,调用encode/decode进行调试,并没有明确思考为何出现乱码

所以调试时最常出现的错误

错误1

错误2

<a href="http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html">字符编码笔记:ascii,unicode和utf-8</a>

<a href="http://www.searchtb.com/2012/04/chinese_encode.html">淘宝搜索技术博客-中文编码杂谈</a>

str和unicode都是basestring的子类

所以有判断是否是字符串的方法

str和unicode 转换
区别

str是字节串,由unicode经过编码(encode)后的字节组成的

声明方式

求长度(返回字节数)

unicode才是真正意义上的字符串,由字符组成

求长度(返回字符数),在逻辑中真正想要用的

结论

搞明白要处理的是str还是unicode, 使用对的处理方法(str.decode/unicode.encode)

下面是判断是否为unicode/str的方法

简单原则:不要对str使用encode,不要对unicode使用decode (事实上可以对str进行encode的,具体见最后,为了保证简单,不建议)

不同编码转换,使用unicode作为中间编码

处理流程,可以这么使用,把python看做一个水池,一个入口,一个出口

入口处,全部转成unicode, 池里全部使用unicode处理,出口处,再转成目标编码(当然,有例外,处理逻辑中要用到具体编码的情况)

ide和控制台报错,原因是print时,编码和ide自身编码不一致导致

输出时将编码转换成一致的就可以正常输出

规范编码

统一编码,防止由于某个环节产生的乱码

环境编码,ide/文本编辑器, 文件编码,数据库数据表编码

保证代码源文件编码

这个很重要

不声明的话,输入非ascii会遇到的错误,必须放在文件第一行或第二行

声明方法

若头部声明coding=utf-8, a = '中文' 其编码为utf-8

若头部声明coding=gb2312, a = '中文' 其编码为gbk

so, 同一项目中所有源文件头部统一一个编码,并且声明的编码要和源文件保存的编码一致(编辑器相关)

在源代码用作处理的硬编码字符串,统一用unicode

将其类型和源文件本身的编码隔离开, 独立无依赖方便流程中各个位置处理

以上几步搞定后,你只需要关注两个 unicode和 你设定的编码(一般使用utf-8)

处理顺序
获得和设置系统默认编码
str.encode('other_coding')

在python中,直接将某种编码的str进行encode成另一种编码str

'获得和设置系统默认编码'和这里的str.encode是相关的,但我一般很少这么用,主要是觉得复杂不可控,还是输入明确decode,输出明确encode来得简单些(个人观点)

chardet
\u字符串转对应unicode字符串
python unicode文档

<a href="http://docs.python.org/2/tutorial/introduction.html#unicode-strings">入口</a>

欢迎star我的开源web框架blade:http://github.com/biezhi/blade