Python中有两种string对象,我们将字符串的类型是unicode的叫做unicode字符串,其他的都叫做str字符串。
1 Unicode字符串、str字符串和其编码类型:
unicode字符串是一个概念上的类型。在python中,这种类型是存在于在声明中,s=u'中国'和从str decode和从unicode编码文件读出来的结果中。
Unicode类型与其编码的类型是不同的。Unicode类型可以用utf-8, utf-16等编码类型来表示,经过这些编码后,其字符串类型是str的了,不是unicode了。str字符串是有各种不同的编码的,比如Gbk, gb2312, big5等,他们的类型就是str的了
2Python指定源文件的类型后,字符串是什么编码格式
如果python源文件指定了编码类型,那么这个源文件中所有声明的字符串都与这个编码类型相同。查看对象的类型为s.__class__, 比如:
1)通过声明定义python源文件的编码:#-*-coding=utf-8-*-
那么声明定义 s = '中国', s为str字符串,编码类型为utf-8
如果通过声明定义python源文件的编码:#-*-coding=gbk-*-
那么声明定义 s = '中国', s为str类型,这种类型的编码为gbk。
如果想要定义s为unicode类型,那么 可以定义s=u'中国'
2)如果这个字符串是从文件中读出的,那么这个字符串的类型与打开文件时所指定的类型一样,与python源文件指定的类型无关。比如:
如果通过声明定义python源文件的编码:#-*-coding=gbk-*-
那么通过文件读出的字符串:
f = codecs.open("x0000", 'r', 'utf-8')
content = f.read()
content的编码类型为unicode,并不是gbk
如果打开文件时不指定编码类型,默认按照源文件的类型打开文件
f= codecs.open("test", 'r')
content = f.read()
content的编码类型为gbk
3 Python中的encode和decode函数
Python中的各种编码的类型的转换都是通过unicode作为中间人的。
str--decode-->unicode-->--encode-->str
str对象通过decode函数将str对象转化为unicode对象。比如str的编码类型为gbk, 那么转化到unicode的方式为: str = str.decode('gbk'),这里decode的参数是要与str encoding时的参数一致的,否则会出错
unicode 对象通过encode函数将str转化为所需要的编码。
s =u"中国" s = s.encode('gb2312')
那么这么看来decode只是针对str对象的,encode只是针对unicode对象的,那么为什么还会有str.encode('xx')和unicode.decode('xx')呢?
比如有一个unicode类型
s= u'abc'
对s.decode('gb2312')其结果不会变,仍然是s是unicode类型的,也不会出错,这是因为s都是ascII码。当s=u'中国的时候',s.decode('gb2312')会出错,
当一个str类型的字符串去encode的时候,一般情况下会出错。当str的编码类型是utf-8的时候,好像不会出错。就相当于unicode.encode(xxx),不知道为什么。不过稳妥起见,还是先要把字符串decode到unicode后,再做转换。
4 Python的len函数:
对unicode的类型,len的值是unicode byte的长度,unionbyte可能是16位或者32位
s =u'中国' len(s) = 2
对str类型,len的值是byte的长度,byte为8位,一个字节
s_utf8= s.encode('utf-8') len(s_utf8) = 6
s_gbk = s.encode('gbk') len(s_gbk) = 4