Python中文

在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字符串。

【参考链接】

1、http://blog.csdn.net/mayflowers/article/details/1568852

原文地址:https://www.cnblogs.com/gsblog/p/3860584.html