在python中有两种默认的字符串:str和unicode。在Python中一定要注意区分“Unicode字符串”和"Unicode对象”的区别。
后面所有的“Unicode字符串”都是指"Unicode对象”。
一个传统的字符串完全可以用str对象表示,它仅仅是一个字节流,除非解码为unicode对象,否则没有任何实际意义。
一开始先上例子
>>> s='哈哈' >>> s 'xe5x93x88xe5x93x88' >>> type(s) <type 'str'> >>> >>> ss = u'哈哈' >>> ss u'u54c8u54c8' >>> type(ss) <type 'unicode'>
ss声明为unicode
>>> u = s.decode('utf8') >>> u u'u54c8u54c8' >>> print u 哈哈 >>> >>> u = s.decode('utf-16') >>> >>> u u'u93e5ue588u8893' >>> print u 鏥�袓
将字符串s(utf8编码)使用decode进行解码后,可以得到同等得unicode对象,和直接声明为unicode的ss一样
>>> u=ss.decode('utf8') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/sinasrv2/lib/python2.7/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) >>> u=ss.encode('utf8') >>> u 'xe5x93x88xe5x93x88' >>> print u 哈哈
可以将unicode对象编码encode成其他字符集,不能进行解码decode,decode是针对utf8、GBK编码来说的
下面再给一个例子进行说明:
1、先声明一个unicode对象
2、将其编码成gbk
3、直接print出现不显示
4、使用decode解码成GBK,正确显示
>>> ss = u'哈哈' >>> ss u'u54c8u54c8' >>> t = ss.encode('gbk') >>> t 'xb9xfexb9xfe' >>> print t >>> >>> print t.decode('gbk') 哈哈
序列化unicode对象
>>> str(ss) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
向文件直接输出ss会抛异常。在处理unicode中文字符串的时候,必须首先对它调用encode函数,转换成其他编码输出。
总结:在Python中,str对象就是一个字节数组,至于里面的内容是不是一个合法的字符串,以及这个字符串采用什么编码都不重要。
这些内容需要用户自己记录和判断。这个限制也同样适用于unicode对象。要记住unicode对象中的内容可绝对不一定就是合法的unicode字符串。
【参考链接】