Python 字符

本文最后更新于:2022年7月4日 上午

“字符串”是个相当简单的概念:一个字符串是一个字符序列。本文记录 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
    22
    s = '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
    38
    cafe = 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] 元素。

参考资料


Python 字符
https://www.zywvvd.com/notes/coding/python/fluent-python/chapter-4/python-text/python_text/
作者
Yiwei Zhang
发布于
2022年5月30日
许可协议