本文最后更新于:2024年5月7日 下午
“字符串”是个相当简单的概念:一个字符串是一个字符序列。本文记录 Python 中字符串相关内容。
Unicode 标准
从 Python 3 的 str 对象中获取的元素是 Unicode 字符
-
Unicode 标准把字符的标识和具体的字节表述进行了如下的明确区分。
- 字符的标识,即码位,是 0~1 114 111 的数字(十进制),在 Unicode 标准中以 4~6 个十六进制数字表示,而且加前缀“U+”。例 如,字母 A 的码位是 U+0041,欧元符号的码位是 U+20AC,高音 谱号的码位是 U+1D11E。在 Unicode 6.3 中(这是 Python 3.4 使用的 标准),约 10% 的有效码位有对应的字符。
- 字符的具体表述取决于所用的编码。编码是在码位和字节序列之间 转换时使用的算法。在 UTF-8 编码中,A(U+0041)的码位编码成 单个字节 \x41,而在 UTF-16LE 编码中编码成两个字节 \x41\x00。再举个例子,欧元符号(U+20AC)在 UTF-8 编码中是 三个字节——\xe2\x82\xac,而在 UTF-16LE 中编码成两个字 节:\xac\x20。
-
把码位转换成字节序列的过程是编码;把字节序列转换成码位的过程是解码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22s = 'café'
print(len(s))
>>>
4
<<<
b = s.encode('utf8')
print(b)
>>>
b'caf\xc3\xa9'
<<<
print(len(b))
>>>
5
<<<
b.decode('utf8')
print(b)
>>>
café
<<<
字节概要
-
Python 内置了两种基本的二进制序列类型:Python 3 引入的不可变 bytes 类型和 Python 2.6 添加的可变 bytearray 类型。
-
bytes 或 bytearray 对象的各个元素是介于 0~255(含)之间的整 数,而不像 Python 2 的 str 对象那样是单个的字符。然而,二进制序列 的切片始终是同一类型的二进制序列,包括长度为 1 的切片。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38cafe = bytes('café', encoding='utf_8')
print(cafe) # 编码序列
>>>
b'caf\xc3\xa9'
<<<
print(cafe[0])
>>>
99
<<<
print(cafe[:1])
>>>
b'c'
<<<
cafe_arr = bytearray(cafe)
print(cafe_arr)
>>>
bytearray(b'caf\xc3\xa9')
<<<
print(cafe_arr[-1:])
>>>
bytearray(b'\xa9')
<<<
cafe_arr_tmp = cafe_arr
cafe_arr_tmp[-1] = 79
print(cafe_arr) # bytearray 可变对象测试
>>>
bytearray(b'caf\xc3O')
<<<
print(id(cafe_arr) == id(cafe_arr_tmp)) # 修改后仍然是同一对象
>>>
True
<<< -
my_bytes[0] 获取的是一个整数,而 my_bytes[:1] 返回的 是一个长度为 1 的 bytes 对象——这一点应该会让人意 外。s[0] == s[:1] 只对 str 这个序列类型成立。不过,str 类 型的这个行为十分罕见。对其他各个序列类型来说,s[i] 返回一 个元素,而 s[i:i+1] 返回一个相同类型的序列,里面是 s[i] 元素。
参考资料
文章链接:
https://www.zywvvd.com/notes/coding/python/fluent-python/chapter-4/python-text/python_text/
“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”
微信支付
支付宝支付