本文共 1600 字,大约阅读时间需要 5 分钟。
——————————————————————————————————————
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')>>> s1u'\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 codeprint getCode(s),getCode(s1),getCode(s2),getCode(s3)print s,s1,s2print len(s),len(s1),len(s2),len(s3)
然后是utf8版
# coding:utf8s = '我'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 codeprint getCode(s),getCode(s1),getCode(s2),getCode(s3)print s,s1,s2,s3print len(s),len(s1),len(s2),len(s3)两个版本分别在cmd窗口,eclipse,idle下运行,情况如下:
idle全部能正常显示(哇!兼容做得不错,赞一个),
gbk
\206\210 \25105 \230\136\145 \206\210我 我 我2 1 3 2utf8
\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报错