理解unicode:
在python里面关于字符串有两个类:str和unicode, 据说python3里面没有了unicode这个类了。
需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
也就是说unicode只是一个虚拟的东西,真正的实现方法是有很多的(UTF-8就是在互联网上使用最广的一种unicode的实现方式)。
我想当初为什么区分str和unicode类,可能主要是str表示的字节序列是一个有实际编码方式的字符串,而unicode字符串主要是记录的
是这个字符串在unicode字符集中对应的编号。
eg:
>>> s1="燕子"
>>> u1=u"燕子"
>>> s1
'/xe7/x87/x95/xe5/xad/x90'
>>> u1
u'/u71d5/u5b50'
>>> print s1
燕子
>>> print u1
燕子
>>>
从上面的例子我们可以看出实际上s1字符串的编码方式采用了我们默认的“utf-8”形式
不过这里备注一下,python里面有一个外带的模块chardet可以很方便的实现字符串/文件的编码检测。
chardet官方网址:http://chardet.feedparser.org/
码制问题:
在一般的python环境当中默认的编码是:ascii 默认的中文编码:utf-8
python系统里面提供了一个检测自己的默认码制的函数:sys.getdefaultencoding()查询,当然你也可以在site模块中设置默认的编码
在python当中编码转换一般都是以unicode作为中间转换编码的。
如图:
字符串对象S.decode([encoding[,errors]]):将其他编码形式的字符串S转换成unicode字符码值的ascii码形式
eg:str1.decode('gb2312') 表示将gb2312编码的字符串转换为unicode字符码值的ascii码
字符串对象S.encode([encoding[,errors]]):将字符串对象S的unicode字符码值的ascii码转换为其他编码
eg:str1.encode('gb2312') 表示将unicode字符码值的ascii码转换为gb2312编码的字符串。
上面的decode和encode方法的两个参数encoding和errors的取值情况说明:
encoding参数取值表:
值 描述
'ascii' 7位Ascii码
'latin-1'或'iso-8859-1' ISO 8859-1 Latin-1
'cp1252' Windows 1252编码
'utf-8' 8位变长编码
'utf-16' 16位变长编码
'utf-16-le' UTF-16, 小尾编码
'utf-16-be' UTF-16, 大尾编码
'unicode-escape' 与unicode字面量u"string"相同的格式
'raw-unicode-escape' 与unicode字面量ur"string"相同的格式
errors参数取值表:
值 描述
'strict' 遇到编码和解码错误时,引发UnicodeError异常
'ignore' 忽略无效字符
'replace' 将无效字符替换为一个替换字符(Unicode中的U+FFFD,标准字符串中的'?')
'backslashreplace' 将无效字符替换为python字符转义序列。例如,将字符U+1234替换为'/u1234'
'xmlcharrefreplace' 将无效字符替换为XML字符引用。例如,将字符U+1234替换为'ሴ'
在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是IDE的结果输出控制台本身不能显示字符串的编码,而不是程序本身的问题。
在python当中判断一个字符串是否是unicode对象,可以使用类似于:isinstance(s,unicode) ---- 判断字节序列s是否是unicode对象
python当中:
unicode(s[,encoding]) 等同于 s.decode([encoding])
eg:
>>> zn="燕子"
>>> print zn
燕子
>>> zn
'/xe7/x87/x95/xe5/xad/x90'
>>> uni_zn=unicode(zn,"utf-8")
>>> print uni_zn
燕子
>>> uni_zn
u'/u71d5/u5b50'
>>> uni_zn.encode("utf-8")
'/xe7/x87/x95/xe5/xad/x90'
>>>