您的位置:首页 > 编程语言 > Python开发

python程序设计第6课第四章Unicode与字符串

2020-05-11 04:12 85 查看

第四章 Unicode与字符串

*正则表达式和字符串的常用操作不是重点,老师讲的也很水

开头扯了点计算机历史,这段简单记下
Bit(比特)是计算机和数字通信中信息的基本单位。历史上字节(1 byte=8 bit)是用于在计算机中对文本的单个字符进行编码(encode)的位数(the number of bits),因此在许多计算机体系结构中,byte是最小的存储单元。

最早的ASCII码只用到了0127的编码,因此出现了EASCII码来利用128255的编码,然而仍然有更大的需要,所以出现了Unicode。Unicode是为了处理,显示传播字符串,防止不同机子上的乱码问题。现在的Unicode范围为0~1114111(0x10ffff)

一,Unicode的基本概念

字符(character)是文本中最小的组成部分,如"A",“B”,"C"等都是不同的字符。Unicode标准描述如何用code point表示字符。一个code points(实际上就是一个整数值,通常写成U+4位16进制的形式,比如U+12CA表示值为0x12ca的字符)对应一个character。Unicode标准就包含了许多表,其中列出了character及其对应的code point

字符(character)在屏幕上或纸上由一组称为字形(glyph)的图形元素表示。glyph用来考虑怎么显示和打印,不过我们一般不用考虑这东西,这是电脑和打印机要考虑的事情。确定要显示的正确字形通常是GUI toolkit(GUI工具箱)或terminal’s font renderer(终端字体呈现器)的工作。Unicode标准本身不关心字符如何显示,它仅仅规定了概念上的chracter与code points的对应关系,它实际上对概念上的chracter进行编码

二,Encoding(编码)

Unicode字符串是一系列code point,它们是0到0x10ffff之间的数字。这个序列需要在内存中表示为一组字节(即0-255之间的值)。encoding就是把概念上的Unicoding string(a sequence of code points)编码转化为sequence of bytes的过程。编码是必须的过程,因为信息,字符串要进行传播和存储,必须要用字节序列

三,李光夏设计的一种简易编码方式及对其缺点的解决方案

用4个字节32位来表示一个code points。这种编码方式的缺点是可执行性差(不同处理器对从低位还是高位开始读字节不同),浪费空间,和现有的C函数并不兼容,各种通行协议要加倍,不利于传输
*>>>print(’{0:b}’.format(80)) 要求python十进制的80转换为二进制并打印出来

解决方案的思想:
1.可变长度
不要用固定长度的32-bit integer(4 bytes)。常用字符小编号,不常用字符大编号。
2.兼容已有的编码标准(如ASCII)

四,UTF-8

*Unicode不是编码方式(encoding)而是一种标准,概念性的编号。UTF-8是众多编码方式中的一种,注意两者的区别

UTF-8的措施以迎合解决思想(UTF-8的特点肯定要考的,老师亲自批示)
1.code point<128 1个字节,由对应的字节值表示(兼容ascii)
2.code point 128~0x7ff(2047) 2个字节,两个字节值为128~255
3.>0x7ff 34个字节(128255),每个字节值为128~255

*UTF-8编码的优点(这个老师说的很快,不过因为这个可能比较重要我就把PPT上的英文机翻了一下)
1.可以处理任何Unicode code point。
2.一个Unicode字符串被转换成一个不包含嵌入式零字节的字节字符串。这避免了字节排序问题,
并且意味着UTF-8字符串可以由诸如strcpy()之类的C函数处理,并通过不能处理零字节的协议发
送。
3.ASCII文本字符串也是有效的UTF-8文本,二者可以兼容。
4.UTF-8相当紧凑;大多数代码点被转换成两个字节,小于128的值只占一个字节。

五,python字符串的常见操作

(这里讲的很简单,大概就说了半小时不到,自己看PPT)

string属于不可变序列(即不可通过切片和下标索引的方式改变)

1.字符串驻留机制:

短的字符串将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本

2.转义字符:

*\n \t(行向制导符)也是字符,只是不显示出来而已
*>>>ord(’\n’) 返回转义字符的十进制ascii编号

例:
>>>s='a\nb\tc'
>>>s
'a\nb\tc'
>>>print(s)
a
b           c
>>>len(s)
5
>>>ord('\n')
10
>>>ord('\t')
9

*\ 用来表示输出一个真正的,加不加的print区别具体看PPT例子,也可以在字符串前面加r或者R来关闭转义机制(这在正则表达式里很常见)

3.字符串格式化

(回去可以好好看format,老师亲自批示)
*>>>"%b" %1235 是错误的写法,不能直接用%,要用format才能用二进制显示,即>>>"{0:b}".format(1235),得到’10011010011’

4.字符串常用方法

(很多叫我们回去自己看,这里只记他稍微强调的几个)

.find()和.rfind() .index()和.rindex() .count()

*加r表示从右边开始找,find()只是找有没有,index()则是返回位置

.split()和.rsplit()根据一定的分割符切割字符串并返回列表

*不加参数会默认以空格和换行等进行切割字符串。还可以指定最大分割次数

.join()联结字符串

联结字符串要先把字符串一起放到列表里,不要用+

.strip()删除空格

从外部终端利用input()读入字符串时一般都先要用下.strip()把字符串左右两边可能有
的空格删掉再进行转换为整数等操作

eval() in成员判断 .startswith(),.endwith()

给的例子里结合该函数用列表推导式从当前目录选出图片判断字符串是否以给定字符串开始或者结束

5.字符串常量
6.可变字符串

(一般不太用,知道能这么用就行,要用再回来看。考试不会考这么细)

非要原地修改unicode数据对象,就要用io.StringIO对象或者array模块

*python里面有一种叫做unicode的数据类型,当它作为一种数据类型的时候,u一定要小写,定义unicode string用>>>s=u"Hello,world"。前面加小写字母u

法一:使用io.StringIO对象

>>> import io
>>> s = u"Hello, world"
>>> sio = io.StringIO(s)                 io模块转化一下
>>> sio.getvalue()
u'Hello, world'
>>> sio.seek(7)                          seek定位一下
7L
>>> sio.write(u"there!")                 把world替换为there
6L
>>> sio.getvalue()
u'Hello, there!'
法二:利用array.array()和unicode string构造一个array对象,通过下标索引来改变字符串,再用.tounicode()转换回来

>>> import array
>>> a = array.array('u', u'Hello, world')
>>> print a
array('u', u'Hello, world')
>>> a[0] = u'y'
>>> print a
array('u', u'yello, world')
>>> a.tounicode()
u'yello, world'

*import this 自己去读读看,老师没讲

编辑于2020-3-26 14:49
修改于2020-4-26 21:42

CS_Lee_ 原创文章 16获赞 0访问量 2302 关注 私信
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: