python_bytes(字节串)/string(字符串)/unicode码/utf-8编码/字面值/原始字符串/字符串编码&字节解码

网友投稿 534 2022-08-30


python_bytes(字节串)/string(字符串)/unicode码/utf-8编码/字面值/原始字符串/字符串编码&字节解码

文章目录

​​python_bytes(字节串)/string(字符串)​​

​​references​​​​synopsis​​​​bytes 对象​​

​​class bytes([source[, encoding[, errors]]])​​​​字面值(literal values)​​​​创建bytes对象​​

​​python_string​​​​ascii码​​​​unicode码​​

​​UTF-8编码​​

​​对字符串进行编码​​

​​python 字符串编码&字节解码​​

​​对字符串对象编码​​

​​对字节对象解码​​​​python字节码对象​​

python_bytes(字节串)/string(字符串)

references

​​2. 词法分析 — Python 3 文档​​

​​ 字面值¶​​

​​bytes-objects​​

synopsis

二进制序列类型 — bytes, bytearray, memoryview 操作二进制数据的核心内置类型是 bytes 和 bytearray。 它们由 memoryview 提供支持,该对象使用 缓冲区协议 来访问其他二进制对象所在内存,不需要创建对象的副本。array 模块支持高效地存储基本数据类型,例如 32 位整数和 IEEE754 双精度浮点值。

bytes 对象

bytes 对象是由单个字节构成的不可变序列

由于许多主要二进制协议都基于 ASCII 文本编码,因此 bytes 对象提供了一些仅在处理 ASCII 兼容数据时可用,并且在许多特性上与字符串对象紧密相关的方法。

class bytes([source[, encoding[, errors]]])

首先,表示 bytes 字面值的语法与字符串字面值的大致相同,只是添加了一个 b 前缀:

单引号: b’同样允许嵌入 “双” 引号’。双引号: b"同样允许嵌入 ‘单’ 引号"。三重引号: b’‘‘三重单引号’’', b"““三重双引号””"

字面值(literal values)

(Literal Values : A literal value is any part of a statement or expression that is to be used exactly as it is,rather than as a variable or a Lingo element.)像字符串字面值一样,bytes 字面值也可以使用 r 前缀来禁用转义序列处理。

请参阅 字符串与字节串字面值 了解有关各种 bytes 字面值形式的详情,包括所支持的转义序列。

class bytes([source[, encoding[, errors]]]) 返回一个新的“bytes”对象, 是一个不可变序列,包含范围为 0 <= x < 256 的整数。 bytes 是 bytearray 的​​不可变版本​​ - 它有其中​​不改变序列的方法和相同的索引、切片操作​​。因此,构造函数的实参和 bytearray() 相同。

创建bytes对象

字节对象可以用字面值创建,参见 字符串与字节串字面值。除了字面值形式,bytes 对象还可以通过其他几种方式来创建:

指定长度的以零值填充的 bytes 对象: bytes(10)

通过由整数组成的可迭代对象: bytes(range(20))

通过缓冲区协议复制现有的二进制数据: bytes(obj)

似乎难以直接将包含字节串字面值的字符串包装成字节串类型

python_string

​​字符串和编码 (liaoxuefeng.com)​​Text Sequence Type —​​​str​​​​​Built-in Types — Python 3.10.4 documentation​​

ascii码

在计算机内部,所有数据都使用二进制表示。

每一个二进制位(bit)有 0 和 1 两种状态,因此8 个二进制位就可以组合出 256 种状态,这被称为一个字节(byte)。一个字节一共可以用来表示 256 种不同的状态,每一个状态对应一个符号,就是 256 个符号,从0000000 到 11111111。

ASCII码:

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码。ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

缺点:

不能表示所有字符。相同的编码表示的字符不一样:比如,130在法语编码中代表了​​é​​​,在希伯来语编码中却代表了字母​​Gimel (ג)​​

unicode码

Unicode 码&乱码:

乱码:世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。Unicode:一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,使用 Unicode 没有乱码的问题。

Unicode 的缺点:

Unicode只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储:

无法区别 Unicode和 ASCII:计算机无法区分三个字节表示一个符号还是分别表示三个符号。另外,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储空间来说是极大的浪费。

UTF-8编码

UTF-8 是在互联网上使用最广的一种Unicode 的实现方式。

UTF-8 是一种变长的编码方式。

它可以使用1-6 个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则:

对于单字节的UTF-8编码,该字节的最高位为0,其余7位用来对字符进行编码(等同于ASCII码)。对于多字节的UTF-8编码,

如果编码包含 n 个字节,那么第一个字节的前 n 位为1,第一个字节的第 n+1 位为0,

该字节的剩余各位用来对字符进行编码。

在第一个字节之后的所有的字节,都是最高两位为"10",其余6位用来对字符进行编码

对字符串进行编码

python 字符串编码&字节解码

对字符串对象编码

以python为例,调用字符串(str)类型的对象的编码方法(encode),将字符串编码转换为字节对象(bytes)

1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。

>>> a="text">>> a.encode('utf-8')b'text'>>> b=a.encode('utf-8')>>> bb'text'>>> type(b)>>> type(a)

>>> c="测试".encode('utf-8')>>> cb'\xe6\xb5\x8b\xe8\xaf\x95'>>> len(c)6#可见,两个中文字符(字符串长度为2),被编码为utf-8的字节后,占了6个字节

对字节对象解码

>>> c.decode('utf-8')'测试'>>> type(c)>>> d=c.decode('utf-8')>>> type(d)>>> len(d)2

python字节码对象

Only ASCII characters are permitted in bytes literals (regardless of the declared source code encoding). Any binary values over 127 must be entered into bytes literals using the appropriate escape sequence.As with string literals, bytes literals may also use a​​r​​​ prefix to disable processing of escape sequences. See​​String and Bytes literals​​ for more about the various forms of bytes literal, including supported escape sequences.


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python_列表推导式的使用和嵌套规律(python3列表推导式)
下一篇:生成/得到指定范围内的随机数(数组)(基于[0,1)的随机数制作)得到[x,y](numpy/js)/得到不重复的指定范围内的随机数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~