Python 字符

2022-08-10 14:06:21 浏览数 (1)

“字符串”是个相当简单的概念:一个字符串是一个字符序列。本文记录 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 编码中编码成两个字节 x41x00。再举个例子,欧元符号(U 20AC)在 UTF-8 编码中是 三个字节——xe2x82xac,而在 UTF-16LE 中编码成两个字 节:xacx20。
  • 把码位转换成字节序列的过程是编码;把字节序列转换成码位的过程是解码。
代码语言:javascript复制
s = 'café'
print(len(s))
>>>
4
<<<

b = s.encode('utf8')
print(b)
>>>
b'cafxc3xa9'
<<<

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 的切片。
代码语言:javascript复制
cafe = bytes('café', encoding='utf_8')
print(cafe) 							# 编码序列
>>>
b'cafxc3xa9'
<<<

print(cafe[0])
>>>
99
<<<

print(cafe[:1])
>>>
b'c'
<<<

cafe_arr = bytearray(cafe)
print(cafe_arr)
>>>
bytearray(b'cafxc3xa9')
<<<

print(cafe_arr[-1:])
>>>
bytearray(b'xa9')
<<<

cafe_arr_tmp = cafe_arr
cafe_arr_tmp[-1] = 79
print(cafe_arr)							# bytearray 可变对象测试
>>>
bytearray(b'cafxc3O')
<<<

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] 元素。

参考资料

  • 流畅的Python(2017年人民邮电出版社出版)

0 人点赞