编码解码
1.py2编码
srt和Unicode
str和Unicode都是basestring的子类。严格意义上说,str其实是字节串,他是unicode经过编码后的字节组成的序列。
对utf8编码的str‘苑’使用len()函数时,结果是3,因为utf8编码的‘苑’=='\xe8\x8b\x91'。
而unicode是一个字符串,str是unicode这个字符串经过编码(utf8,gbk等)后的字节组成的序列。
unicode才是真正意义上的字符串,对字节串str使用正确的字符编码进行解码后获得,并且len(u'苑')==1
在py2里,str=bytes
py2编码的最大特点是Python2将会自动的将bytes数据解码成unicode字符串
所以py2里面可以将字节与字符串拼接
repr()查看存到内存里面的是什么
str里面存的是bytes
type()查看类型
变量=u'' 存的unicode类型
py2特点:
print 'hello'+u'yuan'
bytes类型加unicode类型可以直接跨类型拼接字符串
因为会自动进行类型转换把bytes转换成了unicode
字节串和字符串
UnicodeError。你的代码中包含了unicode和byte字符串,只要数据全部是ASCII的话,所有的转换都是正确的,
一旦一个非ASCII字符偷偷进入你的程序,那么默认的解码将会失败,从而造成UnicodeDecodeError的错误。
python2悄悄掩盖掉了byte到unicode的转换,让程序在处理ASCII的时候更加简单。而付出的代价就是处理非
ASCII的时候将会失败。
在进行表转换的时候要先转换为unicode,然后在转换所需要的表
utf8---》unicode---》gbk
默认ASCII码打印,打印到控制台需要编码
2.py3编码
python3中对unicode 支持的最大变化就是就是将会没有对byte字节串的自动解码。如果直接用一个byte字节串和一个
unicode相连接,就会报错,不管内容是什么。
注:python2中有隐式处理,python3中没有
python3中控制台默认utf8编码打印
3.常见编码错误:
cmd下乱码问题;在IDE下用2和3执行都没问题,在cmd下3正确,2乱码
在windows终端下去执行cmd.exe去执行,但cmd.exe本身是一个软件;当我们pythong2 hello.py时,python2解释器(默认ASCII编码)
去按声明的utf8编码文件,而文件又是utf8保存的,所以没问题;问题是出在当print时解释器正常执行,不会报错,但是print的内容
会传递给cmd.exe显示,而在py2里面这个内容就是utf8编码的字节数据,而这个软件默认的编码解码方式时GBK,所以cmd.exe用GBK的解
码方式去解码utf8就会乱码。
py3传递给cmd.exe的是unicode数据,符合ISO统一的标准,所以没问题。