在python中有两种默认的字符串:str和unicode。在Python中一定要注意区分“Unicode字符串”和"Unicode对象”的区别。
后面所有的“Unicode字符串”都是指"Unicode对象”。
一个传统的字符串完全可以用str对象表示,它仅仅是一个字节流,除非解码为unicode对象,否则没有任何实际意义。
一开始先上例子
>>> s='哈哈'
>>> s
'\xe5\x93\x88\xe5\x93\x88'
>>> type(s)
<type 'str'>
>>>
>>> ss = u'哈哈'
>>> ss
u'\u54c8\u54c8'
>>> type(ss)
<type 'unicode'>
ss声明为unicode
>>> u = s.decode('utf8')
>>> u
u'\u54c8\u54c8'
>>> print u
哈哈
>>>
>>> u = s.decode('utf-16')
>>>
>>> u
u'\u93e5\ue588\u8893'
>>> 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
'\xe5\x93\x88\xe5\x93\x88'
>>> print u
哈哈
可以将unicode对象编码encode成其他字符集,不能进行解码decode,decode是针对utf8、GBK编码来说的
下面再给一个例子进行说明:
1、先声明一个unicode对象
2、将其编码成gbk
3、直接print出现不显示
4、使用decode解码成GBK,正确显示
>>> ss = u'哈哈'
>>> ss
u'\u54c8\u54c8'
>>> t = ss.encode('gbk')
>>> t
'\xb9\xfe\xb9\xfe'
>>> 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字符串。
【参考链接】