Python字符与字节新编
字符
字符是一个信息单位,简单来讲就是一个字母、数字、标点符号、汉字等。
字符的最佳定义是Unicode字符:

它是一个全球化的标准,能表示世界上所有语言的字符。Unicode字符的标识(码位)是以4~6个十六进制数字表示的,并且加前缀U+。
字节
字节是计算机信息计量单位,一个字节代表八个比特,存储的数值范围为0~255。
字节跳动(ByteDance)互联网公司的字节就是这个字节。
字节是机器的,字符是人类的。
把人类字符转换为机器字节时使用的算法叫做编码,反之叫做解码。
算法不同,字节与字符的关系也不同:

bytes和bytearray
字节实际上是个二进制序列。不可变bytes类型和可变bytearray类型是用来存储二进制序列的,它们的示例如下:
>>> cafe = bytes("café", encoding="utf_8")
>>> cafe
b'caf\xc3\xa9'
>>> cafe[0]
99
>>> cafe[:1]
b'c'
>>> cafe_arr = bytearray(cafe)
>>> cafe_arr
bytearray(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
- 一个实现了缓冲协议的对象,如bytes、bytearray、memoryview、array.array
memoryview和struct
memoryview允许在二进制数据结构之间共享内存,struct能从序列中提取结构化信息。
示例如下,提取一个GIF图像的宽度和高度:
import struct
with open("filter.gif", "rb") as fp:
img = memoryview(fp.read())
# 这里不会复制字节序列,因为用的memoryview
header = img[:10]
print(bytes(header)) # b'GIF89a+\x02\xe6\x00'
# <是小字节序,3s3s是两个3字节序列,HH是两个16位二进制整数
# 类型、版本、宽度、高度
struct.unpack("<3s3sHH", header) # (b'GIF', b'89a', 555, 230)
# 删除引用,释放memoryview实例所占的内存
del header
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/字符_(计算机科学)
Python字符与字节新编的更多相关文章
- python 字符与字节 json序列和反序列及支持的类型
b = b"demo" s = "demo" # 字符串转字节 s = bytes(s, encoding = "utf8") s = st ...
- Python编程Day7——字符编码、字符与字节、文件操作
一.字符编码 重点 ***** 1. 什么是字符编码:将人识别的字符转换计算机能识别的01,转换的规则就是字符编码表2. 常用的编码表:ascii.unicode.GBK.Shift_JIS.Euc- ...
- python第七天(字符编码,字符与字节,文件操作)
一.字符编码: 定义:将人识别的字符转换成计算机能识别的0和1,转换的规则就是字符编码表. 常见编码表:ascii.unicode.GBK 编码表: 1.采用的都是unicode编码表 2.unico ...
- python字符类型的一些方法
python 字符串和字节互转换.bytes(s, encoding = "utf8") str(b, encoding = "utf-8") i.isspac ...
- python 字符编码练习
通过下面的练习,加深对python字符编码的认识 # \x00 - \xff 256个字符 >>> a = range(256)>>> b = bytes(a) # ...
- Python字符编码讲解
声明:本文参考 Python字符编码详解 在计算机中我们不管用什么语言和程序,最终数据在计算机中的都是字节码(也就是01形式)的形式存在的,如果 计算机直接把字节码显示在屏幕上,很明显一般人看不懂字节 ...
- 深入理解Python字符编码--转
http://blog.51cto.com/9478652/2057896 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError ...
- Python 字符编码及其文件操作
本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...
- 深入理解Python字符编码
不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError.UnicodeDecodeError 错误,每当遇到错误我们就拿着 enc ...
随机推荐
- Android Dex分包之旅
http://yydcdut.com/2016/03/20/split-dex/ http://blog.zongwu233.com/the-touble-of-multidex http://tec ...
- Java并发容器篇
作者:汤圆 个人博客:javalover.cc 前言 断断续续一个多月,也写了十几篇原创文章,感觉真的很不一样: 不能说技术有很大的进步,但是想法确实跟以前有所不同: 还没开始的时候,想着要学的东西太 ...
- SpringBoot程序后台运行
使用nohup命令让进程后台运行 nohup java -jar 自己的springboot项目.jar >日志文件名.log 2>&1 & >日志文件名.log : ...
- druid-spring-boot-starter的配置
#数据源基本信息 spring: datasource: druid: username: root password: 123456 url: jdbc:mysql://localhost:3306 ...
- ES6新增常用方法
字符串新增方法 padStart.padEnd 如果原字符串不够指定长度,则会在左侧(右侧)填充字符串,用以补全 padStart( length: number, fillStr?: string ...
- redis分布式锁-可重入锁
redis分布式锁-可重入锁 上篇redis实现的分布式锁,有一个问题,它不可重入. 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞. 同一个 ...
- [刷题] 219 Contains Duplicate II
要求 给出整型数组nums和整数k,是否存在索引i和j,nums[i]==nums[j],且i和j之间的差不超过k 思路 暴力解法(n2) 建立最长为k+1的滑动窗口,用set查找窗口中是否有重复元素 ...
- [web] 虚拟机网络设置
三种模式 桥接(Bridged):主机网卡--虚拟网桥--虚拟机网卡,把主机虚拟为交换机,虚拟机ip需与主机设置在同一网段,网关与DNS与主机网卡一致 地址转换(NAT):主机网卡--虚拟NAT设备- ...
- [刷题] 3 Longest Substring Without Repeating Character
要求 在一个字符串中寻找没有重复字母的最长子串 举例 输入:abcabcbb 输出:abc 细节 字符集?字母?数字+字母?ASCII? 大小写是否敏感? 思路 滑动窗口 如果当前窗口没有重复字母,j ...
- Ubuntu 16.04 上安装 arm-linux-gcc-4.4.3
参考链接:https://blog.csdn.net/zz56z56/article/details/83021583 注:正常安装后,不同用户切换,需重新刷新环境变量:source /etc/pro ...