python的decode和encode

——————————————————————————————————————

    python 内置的文字编码是utf8

    decode 的作用是将其他编码转为utf8,如str.decode('gbk')将gbk编码转为utf8

    encode 的作用将utf8编码转为其他编码,如str.encode('gbk')将utf8转为gbk

——————————————————————————————————————

这是从网上找到的资料,但是这样的话encode('utf8')方法岂不是很鸡肋???

还是自己试验一次比较好,


>>> s = '我'
>>> s
'\xce\xd2'
>>> s1 = s.decode('gbk')
>>> s1
u'\u6211'
>>> s2 = s1.encode('utf8')
>>> s2
'\xe6\x88\x91'
>>> len(s)
2
>>> len(s1)
1
>>> len(s2)
3


这样看来似乎清晰了一些,Python内置的utf8和encode之后的utf8其实不是同样的“类":

内置的是一个每个字符长度为1的字符串,而转换之后的则是更像真实的内存里的状态,由3个字节组成,

我又写了两个文件来验证,分别采用gbk和utf8编码(额,显示代码部分没有转16进制)

gbk版

s = '我'
s1 = s.decode('gbk')
s2 = s1.encode('utf8')
s3 = s1.encode('gbk')
def getCode(c):
    code = ''
    for i in c:
        code += "\\"+str(ord(i))
    return code
print getCode(s),getCode(s1),getCode(s2),getCode(s3)
print s,s1,s2
print len(s),len(s1),len(s2),len(s3)


然后是utf8版


# coding:utf8
s = '我'
s1 = s.decode('utf8')
s2 = s1.encode('utf8')
s3 = s1.encode('gbk')
def getCode(c):
    code = ''
    for i in c:
        code += "\\"+str(ord(i))
    return code
print getCode(s),getCode(s1),getCode(s2),getCode(s3)
print s,s1,s2,s3
print len(s),len(s1),len(s2),len(s3)

两个版本分别在cmd窗口,eclipse,idle下运行,情况如下:

idle全部能正常显示(哇!兼容做得不错,赞一个),

gbk

\206\210 \25105 \230\136\145 \206\210
我 我 我
2 1 3 2
utf8
\230\136\145 \25105 \230\136\145 \206\210
我 我 我 我
3 1 3 2


eclipse utf8版本最后一个字符乱码,另外一个报错

cmd窗口utf8”半显示”,只有1个长度的utf8和2个长度的gbk能正常显示,其他的乱码(看来python运行的cmd是采用utf8的。。。),gbk报错


结论

Python并不是以UTF8作为默认编码的,而是以Unicode作为默认编码,Unicode是一种编码规范,并不是一种实现,所以我们看到s.decode('utf-8')之后的字符长度是1,只有一个数字。
换句话说,Unicode提供了一套标准,为每个字符设置一个编码值,具体的实现则交给UTF-8等支持Unicode规范的编码去实现。(GBK不支持Unicode)

所以在Python2中,字符编码的关系是





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值