python中codecs模块定义了一个标准python编解码器,能够很好的处理多国语言;其中比较常用的是lookup、open等函数。
在处理编码的时候,如果希望由一种编码转换为另一种编码,则需要中间转换为python的内部编码即unicode,即
原有编码---decode-->python内部编码(unicode)---encode-->目的编码
python的内部是使用unicode来处理的,但是unicode的使用需要考虑的是它的编码格式有两种,一是UCS-2,它一共有65536个码位,另一种是UCS-4,它有2147483648g个码位。对于这两种格式,python都是支持的,这个是在编译时通过--enable-unicode=ucs2或--enable-unicode=ucs4来指定的。那么我们自己默认安装的python有的什么编码怎么来确定呢?有一个办法,就是通过sys.maxunicode的值来判断:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
如果输出的值为65535,那么就是UCS-2,如果输出是1114111就是UCS-4编码。
我们要认识到一点:当一个字符串转换为内部编码后,它就不是str类型了!它是unicode类型:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
输出:
type of a ---<type 'str'>
type of b --- <type 'unicode'>
这样b可以转换为任意编码,比如转换为utf-8,如下
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
这种情况下,c输入会是乱码,这是正常的。因为默认编码为gb2312
当然也可以直接定义为unicode编码,然后转换为需要的编码,如下:
b = aa.encode("utf-8")
print "type of b ---", type(b)
输出:
type of b --- <type 'str'>
import codecs, sys
print ' - ' * 60
# 创建utf-8编码器
look = codecs.lookup( " utf-8 ")
a = " 我爱北京天安门 "
print len(a), a
# 解码为内部的unicode
b = look.decode(a)
# 返回的b[0]是数据,b[1]是长度,这个时候的类型是unicode了
print b[ 1 ], b[0], type(b[0])
# 把内部编码的unicode转换为gb2312编码的字符串,encode方法会返回一个字符串类型
b2 = look.encode(b[0])
# 发现不一样的地方了吧?转换回来之后,字符串长度由21变为了7! 现在的返回的长度才是真正的字数,原来的是字节数
print b2[ 1 ], b2[0], type(b2[0])
# 虽然上面返回了字数,但并不意味着用len求b2[0]的长度就是7了,仍然还是21,仅仅是codecs.encode会统计字数
print len(b2[0])
21 我爱北京天安门
21 我爱北京天安门 <type 'unicode'>
7 我爱北京天安门 <type 'str'>
21
上面的代码就是codecs的使用,是最常见的用法。另外还有一个问题就是,如果我们处理的文件里的字符编码是其他类型的呢?这个读取进行做处理也需要特殊的处理的。codecs也提供了方法.
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
ff = open("c:\\1.txt", "r")
print ff.read(), type(ff.read())
�A�n�A�@�� <type 'str'>
原文件内容为:“你好,世界”,可以看到,通过big5方式打开,转换为unicode后可以正常显示,但是直接打开会显示乱码。
可以自己创建一个big5编码的文件试试,通过notepad++新建big5格式文件即可。
本文转载自http://blog.csdn.net/zhaoweikid/article/details/1642015,由于环境不同,其中有部分改动。