Chinaunix首页 | 论坛 | 博客
  • 博客访问: 206401
  • 博文数量: 163
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1720
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-08 11:41
文章分类

全部博文(163)

文章存档

2011年(1)

2009年(162)

我的朋友

分类: Python/Ruby

2009-06-11 14:55:47

python里面基本上要考虑三种编码格式

1 源文件编码
在文件头部使用coding声明。告诉python解释器该代码文件所使用的字符集。
#/usr/bin/python
#coding: utf8

2 内部编码
代码文件中的字符串,经过decode以后,被转换为统一的unicode格式的内部数据,类似于u'*'。unicode数据可以使用encode函数,再自由转换为其他格式的数据,相当于一个统一的平台。

直接输入unicode数据
>>> u'你好'
u'\u4f60\u597d'

将unicode数据转换为gb2312格式
>>> u'你好'.encode('gb2312')
'\xc4\xe3\xba\xc3'

将输入的gb2312格式的数据解码为unicode
>>> '你好'.decode('gb2312')
u'\u4f60\u597d'
输入数据的格式取决于所用shell终端的编码设置,本例中为zh_CN
[root@chenzheng python]# echo $LANG
zh_CN

解码同时转换为utf8
>>> '你好'.decode('gb2312').encode('utf8')
'\xe4\xbd\xa0\xe5\xa5\xbd'

3 外部输入的编码
其实这个和在python交互shell中输入的字符串,所遇到的情况基本一样。但程序中常常用到从网络,文件读取的数据,故此单独列出,需要特别注意其编码格式是否于系统要求相符。

下面是baidu中文本周金曲榜的链接,返回一个xml文件,编码格式为gb2312


由于xml.etree.EelementTree.parse()不识别gb2312编码,在解析的时候,需要将其转换utf8格式才可以,可以使用下面的函数
def read_page(url):
    """读取gb2312编码的xml文件,转换为utf8格式"""
    import urllib
    udata = urllib.urlopen(url).read().decode('gb2312')
    u8data = udata.encode('utf8')
    return u8data.replace('gb2312', 'utf-8') #简单替换xml文件第一行的encoding属性值

另外,可以使用一个小函数来判断数据的编码格式:
def encoding(s):
    cl = ['utf8', 'gb2312']
    for a in cl:
        try:
            s.decode(a)
            return a
        except UnicodeEncodeError:
            pass
    return 'unknown' 
阅读(501) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~