Python字符与字节新编

开发 后端
字符是一个信息单位,简单来讲就是一个字母、数字、标点符号、汉字等。它是一个全球化的标准,能表示世界上所有语言的字符。Unicode字符的标识(码位)是以4~6个十六进制数字表示的,并且加前缀U+。

[[405158]]

本文转载自微信公众号「dongfanger」,作者dongfanger。转载本文请联系dongfanger公众号。

字符

字符是一个信息单位,简单来讲就是一个字母、数字、标点符号、汉字等。

字符的最佳定义是Unicode字符:

它是一个全球化的标准,能表示世界上所有语言的字符。Unicode字符的标识(码位)是以4~6个十六进制数字表示的,并且加前缀U+。

字节

字节是计算机信息计量单位,一个字节代表八个比特,存储的数值范围为0~255。

字节跳动(ByteDance)互联网公司的字节就是这个字节。

字节是机器的,字符是人类的。

把人类字符转换为机器字节时使用的算法叫做编码,反之叫做解码。

算法不同,字节与字符的关系也不同:

bytes和bytearray

字节实际上是个二进制序列。不可变bytes类型和可变bytearray类型是用来存储二进制序列的,它们的示例如下:

  1. >>> cafe = bytes("café", encoding="utf_8"
  2. >>> cafe 
  3. b'caf\xc3\xa9' 
  4. >>> cafe[0] 
  5. 99 
  6. >>> cafe[:1] 
  7. b'c' 
  8. >>> cafe_arr = bytearray(cafe) 
  9. >>> cafe_arr 
  10. bytearray(b'caf\xc3\xa9'
  11. >>> cafe_arr[-1:] 
  12. 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
  • 一个实现了缓冲协议的对象,如bytes、bytearray、memoryview、array.array

memoryview和struct

memoryview允许在二进制数据结构之间共享内存,struct能从序列中提取结构化信息。

示例如下,提取一个GIF图像的宽度和高度:

  1. import struct 
  2.  
  3. with open("filter.gif""rb"as fp: 
  4.     img = memoryview(fp.read()) 
  5.  
  6. # 这里不会复制字节序列,因为用的memoryview 
  7. header = img[:10] 
  8. print(bytes(header))  # b'GIF89a+\x02\xe6\x00' 
  9.  
  10. # <是小字节序,3s3s是两个3字节序列,HH是两个16位二进制整数 
  11. # 类型、版本、宽度、高度 
  12. struct.unpack("<3s3sHH", header)  # (b'GIF', b'89a', 555, 230) 
  13.  
  14. # 删除引用,释放memoryview实例所占的内存 
  15. del header 
  16. del img 

小结

本文介绍了字符和字节的概念以及它们之间的关系,一个字符对应一个或多个字节。字符是人类的,字节是机器的,编码就是人类字符转换为机器字节,反之叫做解码。然后分别介绍了二进制序列的类型bytes和bytearray,和二进制序列的工具memoryview和struct。

参考资料:

  • 《流畅的Python》
  • http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
  • https://zh.wikipedia.org/wiki/字符_(计算机科学)
  • https://home.unicode.org/
  • https://zh.wikipedia.org/wiki/字节
  • https://www.runoob.com/w3cnote/byte-character.html

 

责任编辑:武晓燕 来源: dongfanger
相关推荐

2009-03-27 10:53:52

注入SQLMySQL

2015-10-19 09:23:44

新编编程女人

2013-10-17 10:35:06

TCP字节流UDP数据报

2022-08-21 21:28:32

数据库实践

2021-09-17 15:18:19

编程语言CPython

2010-03-16 17:14:19

Python字符串

2024-12-20 08:26:25

Python字节码缓存机制__pycache_

2014-06-04 10:52:56

Swift苹果iOS

2022-07-12 16:54:54

字节跳动Flink状态查询

2011-03-21 13:35:29

PHPLAMPGD库

2012-03-05 13:08:35

编程

2018-04-30 18:07:51

谷歌开源编程

2011-10-13 10:07:26

Dart

2021-08-20 06:58:31

C++Python函数

2021-05-24 10:24:42

Golang字符串Python

2011-02-22 14:10:07

Sandy Bridg至强编号

2021-04-23 14:30:26

谷歌SQL开发者

2024-05-11 09:38:05

React编译器React 19

2023-06-09 14:14:45

大数据容器化

2022-05-30 09:43:06

数据库字节跳动数据规模
点赞
收藏

51CTO技术栈公众号