——————————————————————————————————————
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中,字符编码的关系是