字符串相关的复习
目标
掌握字符,字符集,ASCII,unicode,UTF-8的相关内容
掌握python2和python3中不同类型的字符串的相互转化
1. Unicode UTF8 ASCII的补充
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等
字符集(Character set)是多个字符的集合
字符集包括:ASCII字符集、GB2312字符集、GB18030字符集、Unicode字符集等
ASCII编码是1个字节,而Unicode编码通常是2个字节。
UTF-8是Unicode的实现方式之一,UTF-8是它是一种变长的编码方式,可以是1,2,3个字节
了解更多请看故事:ascii和unicode以及utf-8的起源
2.python3中的字符串
python3中两种字符串类型:
str : unicode的呈现形式
bytes :字节类型,互联网上数据的都是以二进制的方式(字节类型)传输的
使用方法:
str 使用encode方法转化为 bytes
bytes 通过decode转化为 str
编码方式解码方式必须一样,否则就会出现乱码
3.python2中的字符串
python2中字符串有两种类型
unicode类型
字节类型
在Python2中,字符串无法完全地支持国际字符集和Unicode编码。为了解决这种限制,Python2对Unicode数据使用了单独的字符串类型。要输入Unicode字符串字面量,要在第一个引号前加上'u'。
Python2中普通字符串实际上就是已经编码(非Unicode)的字节字符串。
3.1 python2中的字节类型字符串
python2 中定义字符串的时候,会自动将字符串转换为合适编码的字节字符串,比如中文:自动转换为utf-8编码的字节字符串
看下面的例子:
>>>a="传智播客"#如此定义字符串的时候,其为字节类型>>>a'\xe4\xbc\xa0\xe6\x99\xba\xe6\x92\xad\xe5\xae\xa2'>>>type(a)<type'str'>
上面的这种定义和在字符串前面加上b的效果一样
>>>c=b"传智播客">>>c'\xe4\xbc\xa0\xe6\x99\xba\xe6\x92\xad\xe5\xae\xa2'>>>type(c)<type'str'>>>>c.decode("utf-8")u'\u4f20\u667a\u64ad\u5ba2'
由于a已经是字节类型,所以只能对其进行解码,转化为str类型
>>>a.encode("utf-8")Traceback(most recent call last):File"<stdin>",line1,in<module>UnicodeDecodeError:'ascii'codec can't decode byte0xe4inposition0:ordinalnotinrange(128)>>>a.decode("utf-8")u'\u4f20\u667a\u64ad\u5ba2'
3.2 python2中的unicode类型字符串
如果需要定义unicode字符串,即非字节类型的字符串的时候需要在前面加上u
>>>b=u"传智播客">>>b u'\u4f20\u667a\u64ad\u5ba2'>>>type(b)<type'unicode'>>>>b.encode("utf-8")'\xe4\xbc\xa0\xe6\x99\xba\xe6\x92\xad\xe5\xae\xa2'
3.3 python2中字节类型和unicode类型的转化
字节类型通过decode转化为unicode类型
unciode类型通过encode方法转化为字节类型
方法的使用和python3相同,但是在方法中默认的编解码方式为ascii,对中文需要手动指定为utf-8
>>>bu'\u4f20\u667a\u64ad\u5ba2'>>>b.encode()Traceback(most recent call last):File"<stdin>",line1,in<module>UnicodeEncodeError:'ascii'codec can't encode charactersinposition0-3:ordinalnotinrange(128)>>>b.encode("utf-8")'\xe4\xbc\xa0\xe6\x99\xba\xe6\x92\xad\xe5\xae\xa2'
小结
本小结重点
掌握unicode和utf-8和ascii的区别
掌握python3中不同类型字符串的相互转化
掌握python2中不同类型的字符串的相互转化