第4章 String

第4章 String

(1)每个UNICODE字符4字节大小,可以用UNICODE描述每种语言的每一个字符,无论当前语言有没有“A”这个字符,U+0041这个UNICODE代码都代表字符”A”。

(2)UNICODE编码被称做UTF-32,因为32位等于4字节。这有一个优点,要找第N个字符,它所在的位置就在4*N字节处。缺点就是浪费很多空间。

(3)因为多数用户所使用的字符不会超过65535.所以另一种UNICODE编码被称做UTF-16(16bits = 2 bytes)。超过65535的字符被消减了。

(4)在UTF-32和UTF-16中有一个不明显的缺点。不同的计算机系统存储单独的字节的方式不同,这意味着U+4E2D在UTF-16中可以存储成4E 2D或2D 4E,这依赖于系统是高位序还是低位序。在同一系统上不会有任何问题,但是如果传输文档到其它系统上,那就必须通过某种方式告诉对方使用哪种“位序”。为了解决这个问题多字节unicode编码定义了“字节顺序标记”,它是一个特殊的不可打印字符,在文档的开始指明文档的字节位序。对于UTF-16,这个字符是U+FEFF;收到的时候可能是FF FE,也可能是FE FF。

(5)UTF-16不能保证每个字符都能用两个字节表示,所以UTF-8诞生了。UTF-8是UNICODE的变长编码系统,不同的字符使用不同数量的字节。对于ASCII字符(A-Z)在UTF-8中每个字符只使用一个字节。不过实际上使用的字节数还是一样的,因为在UTF-8中前128个字符(0~127)是无法分辨ASCII的。一些扩展拉丁字符,用两个字节。(这里的两个字节并不是简单的和UTF-16一样的两个字节,这里有一系列的字节位变换调用),中文字符用三个字节,一些非常少用的字符才用4个字节。缺点:找字符的空间复杂度是O(N);还有就是字节位变换所需要的编解码时间。

(6)在PYTHON3中所有的字符串都是UNICODE字符串,不用将它们特意的编码成UTF-8或CP-l252。UTF-8只是一种编码方式。

(7)python定义字符串可以使用单引号(’)或双引号(’),字符串可以像list一样通过索引反回字串中的单个字符,同样可以像list的一样使用加号(+)连接两个字符号。

(8)python3支持字符串格式化,其基本用法是在一个字符串中插入占位符如:
>>>“{0}’s password is {1}”.format(username, password)#{0}和{1}都是被替换的字段,这里的整数0和1用于指示format中的位置参数。
>>>si_suffixes = [ ‘KB’, ‘MB’, ‘GB’, ‘TB’, ‘PB’, ‘EB’, ‘ZB’, ‘YB’]
>>>’1000{0[0]}=1{0[1]}’.format(si_suffixes)
‘1000KB = 1MB’
因为0指向对像si_suffixes,而sisuffixes是一个list,那么list是可以使用索引指向其中的元素的。

(9)'{0:.1f}{1}’.format(698.24,  ‘GB’),这个格式化字符串中”:.1f”是格式指示符,用来进一步精确定义字串格式。格式指示符必须以冒号开头(:)。详细的格式化字符内容:https://docs.python.org/3.1/library/string.html#format-specification-mini-language

(10)其它格式化函数:
1)s.upper()#字符串大写
2)s.lower()#字符串小写
3)s.count(substr)#统计子串数量
4)s.split(ampersand)#将字符串根据ampersand字符分成几个串,返回一个字符串列表,它有一个可选的第二个参数,用于指定字符串分割几次。
5)字符串分片,s[start:end]。得到字符串s以start开始,以end结束(不包含)

(11)一个不可修改的unicode字符序列称作str。一个不可修改的序列(数字在0~255之间,\x00到\xff)称作bytes。
>>>by = b’abcd\x65′
b’abcde’
>>>len(by)
5
代表by有5个字节长度

(12)bytes对象是不可以修改内容的,如果要修改,有两个方法:
1)得到字符串的片断然后重组成新的bytes。
2)把bytes对象转换成bytearray对象,之后再用bytes()函数转换成bytes:
>>> by = b’abcd\x65′
>>> barr = bytearray(by)
>>> barr
bytearray(b’abcde’)
>>> len(barr)
5
>>> barr[0] = 102
>>> barr
bytearray(b’fbcde’)
>>> by = bytes(barr)
>>>by
b’fbcde’

(13)bytes和str两个类型不可以混用,如:
>>> by = b’d’
>>> s=’abcde’
>>> by+s
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
TypeError: can’t concat bytes to str

(14)bytes对象有decode()方法,它可以对字符进行编码并返回字符串。并且字符串(str)有encode()方法,它可以对字符进行编码并返回bytes对象。
>>>s.count(by.decode(‘ascii’))#将bytes序列用ASCII编码转换成字符串,然后统计该串在s中出现过几次。>>> a_string = ‘深入 Python’ ①
>>> len(a_string)
9
>>> by = a_string.encode(‘utf-8′) ②
>>> by
b’\xe6\xb7\xb1\xe5\x85\xa5 Python’
>>> len(by)
13
>>> by = a_string.encode(‘gb18030′) ③
>>> by
b’\xc9\xee\xc8\xeb Python’
>>> len(by)
11
>>> by = a_string.encode(‘big5′) ④
>>> by
b’\xb2`\xa4J Python’
>>> len(by)
11
>>> roundtrip = by.decode(‘big5’) ⑤
>>> roundtrip
‘深入 Python’
>>> a_string == roundtrip
True

(15)python3假定你的源程序文件——.py文件,使用UTF-8编码格式。(python2的.py文件默认编码是ASCII)可以手动设定文件的编码格式,在文件的第一行写:
#-*- coding: windows-l252 -*-
指定文件的编码格式为windows-l252,技术上讲也可以是第二行,如果第一行是UNIX-LIKE hash-bang命令。
#!/usr/bin/python3
#-*- coding: windows-l252 -*-

(16)str.join(list)将字符串连接起来,用str分隔每个字符串。
>>> words = [‘SEND’, ‘MORE’, ‘MONEY’]
>>> ‘hi’.join(words)
‘SENDhiMOREhiMONEY’

发表回复