本文转载自微信公众号“东方儿”,作者东方儿。转载本文请联系东方儿公众号。字符字符是一个信息单位,简单来说就是字母、数字、标点符号、汉字等。字符最好的定义是Unicode字符:它是一个全球标准,可以代表所有语言的字符在世界上。Unicode字符的标识符(代码点)由4到6个十六进制数字表示,并以U+为前缀。字节字节是计算机信息的计量单位。一个字节代表八位,存储的值范围是0到255。字节跳动互联网公司的字节就是这个字节。字节是给机器的,字符是给人类的。将人类字符转换为机器字节时使用的算法称为编码,反之称为解码。算法不同,字节和字符的关系也不同:bytes和bytearraybytes实际上是一个二进制序列。不可变字节类型和可变字节数组类型用于存储二进制序列,它们的例子如下:>>>cafe=bytes("café",encoding="utf_8")>>>cafeb'caf\xc3\xa9'>>>cafe[0]99>>>cafe[:1]b'c'>>>cafe_arr=bytearray(cafe)>>>cafe_arrbytearray(b'caf\xc3\xa9')>>>cafe_arr[-1:]bytearray(b'\xa9')具体来说,cafe[0]返回一个整数,而cafe[:1]返回一个二进制序列,因为s[0]==s[:1]只对str类型成立,而对于其他类型,s[i]返回一个元素,而s[i:i+1]返回相同类型的序列。二进制序列实际上是整数序列。它们的字面表示法包含ASCII字符(ASCII只能表示英文系统中的字符),比如cafe的b'caf\xc3\xa9',具体规则是:字符从空格到~直接使用ASCII字符制表符\t,换行符字符\n、回车符\r、转义符\\其他字符使用十六进制转义序列,如\x00空字节。有几种构造bytes和bytearray对象的方法:一个str对象和一个encoding关键字参数一个值在0到255之间的可迭代对象。一个实现了buffer协议的对象,比如bytes,bytearray,memoryview,array.arraymemoryview,而structmemoryview,允许二进制数据结构之间的内存共享,并且struct可以从一个序列中读取并提取结构化信息。例子如下提取GIF图片的宽高:importstructwithopen("filter.gif","rb")asfp:img=memoryview(fp.read())#这里不会复制字节序列因为memoryviewheader=usedimg[:10]print(bytes(header))#b'GIF89a+\x02\xe6\x00'#<是小端,3s3s是两个3字节序列,HH是两个16位二进制整数#type,version,width,heightstruct.unpack("<3s3sHH",header)#(b'GIF',b'89a',555,230)#删除引用,释放memoryview实例占用的内存delheaderdelimg总结本文介绍charactersandwords节的概念和它们之间的关系,一个字符对应一个或多个字节。字符是人,字节是机器。编码是将人类字符转换成机器字节,反之称为解码。然后分别介绍了二进制序列的类型bytes和bytearray,以及二进制序列的工具memoryview和struct。参考资料:《流畅的Python》http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.htmlhttps://zh.wikipedia.org/wiki/Character_(计算机科学)https://home.unicode.org/https://zh.wikipedia.org/wiki/字节https://www.runoob.com/w3cnote/byte-character.html
