继续。 先说一下,前面提到,print(string)的时候,如果string是按当前环境编码方式编码的,可以正常输出,不会乱码;如果string不是当前编码的,就会乱码。而print(unicode)是不会乱码的。why?应为print(unicode)的时候,会把unicode先转成当前编码,然后再输出。我没看过print的源码,不过估计是这样的。 string转unicode或者unicode转string,是很常见的操作。 string和unicode都有decode()和encode()方法。decode是string2unicode,encode自然就是unicode2string。看个例子(中文Windows2003下): >>> a = '你好' >>> a '/xc4/xe3/xba/xc3' >>> b = u'你好' >>> c = a.decode('gbk') #gbk string to unicode >>> b == c True >>> c u'/u4f60/u597d' >>> d = b.encode('gbk') #unicode to gbk string >>> d == a True >>> d '/xc4/xe3/xba/xc3' >>> e = b.encode('utf-8') #unicode to utf-8 string >>> e '/xe4/xbd/xa0/xe5/xa5/xbd' decode或者encode的时候,如果不指定编码方式,会按照缺省编码方式来处理。查看、设置缺省编码方式可以这样做: >>> import sys >>> sys.getdefaultencoding() 'ascii' >>> reload(sys) <module 'sys' (built-in)> >>> sys.setdefaultencoding('gbk') 上面调用sys.setdefaultencoding()的时候先reload一下sys module,原因是python启动时缺省会import site.py, 而site.py会del sys.setdefaultencoding(),所以需要reload(sys)。具体可以看看site.py的源码。 接下来说说unicode()函数。其实unicode函数就是调用string的decode()方法,把string转成unicode,例如: >>> a = '你好' >>> b = unicode(a) >>> b u'/u4f60/u597d' >>> c = a.decode('gbk') >>> c u'/u4f60/u597d' >>> print b, c, b==c 你好 你好 True 下一部分说说codec |
|