1.str和undecode介绍
str和unicode都是basestring的子类
python 在内部使用两个字节来存储一个unicode,使用unicode对象而不是str的好处,就是unicode方便于跨平台。
str是字节串,由unicode经过编码(encode)后的字节组成的
unicode才是真正意义上的字符串,由字符组成
字符是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。在 ASCII 编码中,一个英文字母字符存储需要1个字节。在 GB 2312 编码或 GBK 编码中,一个汉字字符存储需要2个字节。在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。在UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。在UTF-32编码中,世界上任何字符的存储都需要4个字节。
搞明白要处理的是str还是unicode, 使用对的处理方法(str.decode/unicode.encode) (decode(解码)/encode(编码))
2.头部编码声明
文件头部编码声明决定了python解析源码中的str的编码选择方式,比如头部声明的是utf-8编码,则代码中s=”中文”python就会按照utf-8编码格式来解析
在python源代码文件中如果有用到非ascii字符,比如中文,那么需要在源码文件头部声明源代码字符编码,格式如下:
#-*- coding: utf-8 -*-
这个格式看起比较复杂,其实python只检查#、coding,编码等字符串,可以简写成#coding:utf-8,甚至还可以写成#coding:u8。
3.使用
你可以用如下两种方式定义一个unicode:
s1 = u"哈哈"
s2 = unicode("哈哈", "utf-8")
设置defaultencoding
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
unicode转str
# coding=utf-8
import sys
reload(sys)
#设置编码
sys.setdefaultencoding('utf-8')
s=u'哈哈'
u=s.encode()
print 'str:',type(s)
print '转化后格式',type(u)
str: <type 'unicode'>
转化后格式 <type 'str'>
#当没有设置defaultencoding时代应该加上指定编码格式,结果一样
# coding=utf-8
s=u'哈哈'
u =s.encode('utf-8')#加入参数
print 'str:',type(s)
print '转化后格式',type(u)
如果你在python代码中进行编码和解码的时候,不指定编码方式,那么python就会使用defaultencoding。 而python默认的编码为ascii
str转unicode
比如你使用str创建unicode对象时,如果不说明这个str的编码格式,那么程序也会使用defaultencoding进行对str的解码。(默认方式为ascii)
u = unicode(“哈哈”) 等价于 u = unicode(“哈哈”,defaultencoding)
例如
# coding=utf-8
s='哈哈'
u =unicode(s)
print type(u)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
#正确代码
# coding=utf-8
s='哈哈'
u =unicode(s,'utf-8')
print type(u)
<type 'unicode'>
#或者提前设置defaultencoding
# coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
s='哈哈'
u =unicode(s)
print type(u)
<type 'unicode'>
结论:
默认的defaultencoding(ascii)不能对中文进行解码,而不能解码,也意味着不能编码成想要的格式。所以,要设置defaultencoding的默认值,或者每次解码编码的时候去给它指定值。