python中编码解码--codecs模块

    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的值来判断: 

import sys
print sys.maxunicode

    如果输出的值为65535,那么就是UCS-2,如果输出是1114111就是UCS-4编码。
我们要认识到一点:当一个字符串转换为内部编码后,它就不是str类型了!它是unicode类型:

 #-*- encoding: gb2312 -*-
 a = "风卷残云"
print  "type of a ---", type(a)
=  a.unicode(a,  "gb2 312 " )
print  "type of b ---", type(b)

输出:

type of a ---<type 'str'>
type of b --- <type 'unicode'>

这样b可以转换为任意编码,比如转换为utf-8,如下


=  b.encode( " utf-8 " )
print  c

这种情况下,c输入会是乱码,这是正常的。因为默认编码为gb2312

当然也可以直接定义为unicode编码,然后转换为需要的编码,如下:

aa = u"你好"
print "type of a ---", type(aa)
b = aa.encode("utf-8")
print "type of b ---", type(b)

输出:

type of a --- <type 'unicode'>
type of b --- <type 'str'>



# -*- encoding: utf-8 -*-
import  codecs, sys

print   ' - ' * 60
#  创建utf-8编码器
look   =  codecs.lookup( " utf-8 ")

=   " 我爱北京天安门 "

print  len(a), a
#  解码为内部的unicode
=  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也提供了方法.

# -*- encoding: utf-8 -*-
import  codecs, sys

#  用codecs提供的open方法来指定打开的文件的语言编码,它会在读取的时候自动转换为内部unicode
bfile  =  codecs.open( "c:\\1 .txt " ' r ' " big5 " )

ss 
=  bfile.read()
bfile.close()
#  输出,这个时候看到的就是转换后的结果。如果使用语言内建的open函数来打开文件,这里看到的必定是乱码
print  ss, type(ss)

import os
ff = open("c:\\1.txt", "r")
print ff.read(), type(ff.read())

输入如下:
你好,世界 <type 'unicode'>
�A�n�A�@�� <type 'str'>

  原文件内容为:“你好,世界”,可以看到,通过big5方式打开,转换为unicode后可以正常显示,但是直接打开会显示乱码。

   可以自己创建一个big5编码的文件试试,通过notepad++新建big5格式文件即可。


本文转载自http://blog.csdn.net/zhaoweikid/article/details/1642015,由于环境不同,其中有部分改动。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值