python 字符串编码

最近写脚本遇到一些字符编码的问题。

Python默认的编码方案是unicode,而系统的编码方案是gbk,从某站抓回来数据编码方案是utf-8同时用的还是全角的字符。

Python 里有几个好用的编码转换函数,unicode()和decode()将其它编码字符转换成unicode字符,encode()函数将unicode字符转换为其它编码字符。ord()函数将unicode字符转换为二进制整型,unichr()将二进制整型转换为unicode字符。

我的解决方案是在python脚本的第一行加上,以支持中文字符

#-*- coding: UTF-8 -*-

加上这一行之后在保存脚本的时候就会以utf8编码来保存,此时脚本里的字符串就是utf8的了。

此时,如果在脚本时有一句 print(“中文”)则会出现乱码,因为”中文”这个常量是utf8,而print是使用系统调用将字符显示在终端,使用的是gbk编码。可以用unicode做为中间编码。用python里的unicode()或decode()函数将其它编码转换为默认的unicode编码,然后再用encode()函数转换为可显示的gbk编码。如下可正常打印调试

print unicode("中文", 'utf8').encode('gbk')

对于全角转半角的问题,根据全角半角的映射关系,通过逐个字符比较,将可以转化的如英文字母数字等转化为半角,而中文等则保持为全角

全角字符unicode编码范围为十六进制 0xFF01 ~ 0xFF5E

半角字符unicode编码范围为0x21~ 0x7E

空格比较特殊,全角为0x3000,半角为0x20在GBK下全角空格为\xa1\xa1

全角转半角

def strQ2B(ustring):
    rstring = ""
    for uchar in ustring:
        inside_code=ord(uchar)
        if inside_code==0x3000:
            inside_code=0x0020
        else:
            inside_code-=0xfee0
        if inside_code<0x0020 or inside_code>0x7e: 
            inside_code = ord(uchar)
        rstring += unichr(inside_code)
    return rstring

半角转全角 

def strB2Q(ustring):
    rstring = ""
    for uchar in ustring:
        inside_code=ord(uchar)
        if inside_code==0x0020:
            inside_code=0x3000
        elif inside_code > 0x20 and inside_code <= 0x7e:
            inside_code += 0xfee0
        rstring += unichr(inside_code)
    return rstring

 

 

posted @ 2013-08-05 01:26  看看存在  阅读(796)  评论(1)    收藏  举报