跳到主要内容

字符串和编码

1. 字符与编码的关系

因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。

  • 字符集:人类看到的文字(如 A🙂),本质是一个抽象的“符号集合”。
  • 编码:把字符映射为二进制数的规则。
    • ASCII:早期标准,只支持英文和少数字符。
    • Unicode:统一全球字符集,每个字符有唯一码点(如 U+4E2D)。
    • UTF-8:把 Unicode 码点按 1~4 字节编码的具体实现(可变长编码)。

记忆口诀:字符集管“有哪些字”,编码管“这些字怎么变成 0 和 1”。

2. Python 中的 strbytes

  • str
    • 在 Python 中:str 表示 Unicode 字符串
    • 代码里写的字符串字面量("hello""中文")默认就是 str
  • bytes
    • bytes字节序列,是已经按照某种编码转换后的结果。
    • 常用于:网络传输、文件读写、二进制协议。

常见字面量:

  • b'ABC'bytes,只允许 ASCII 字符。
  • 'ABC''中文'str,可以是任意 Unicode 字符。

3. ord()chr()len()

  • ord(c):字符 → 编码值(码点整数)
ord('A')      # 65
ord('中') # 20013
  • chr(n):编码值 → 字符
chr(65)       # 'A'
chr(20013) # '中'

记忆:ord 像“order 编号”,chr 是 “character 字符”

  • len():注意 strbytes 的区别
    • str:返回 字符个数
    • bytes:返回 字节数
len('中')              # 1(一个字符)
len('中'.encode('utf-8')) # 3(UTF-8 下 3 个字节)

4. encode()decode()

核心记忆:str.encode(编码) -> bytesbytes.decode(编码) -> str

  • 编码
'中'.encode('utf-8')   # str -> bytes
  • 解码
b'\xe4\xb8\xad'.decode('utf-8')  # bytes -> str

注意:

  • 编码和解码时使用的编码 必须一致,否则会报错或出现乱码。

5. 字符串格式化与编码

常见三种格式化方式(记住方向:值 → 字符串):

  • 百分号格式化
'Hello, %s, you have %d messages.' % ('Bob', 5)
  • str.format
'Hello, {}, you have {} messages.'.format('Bob', 5)
  • f-string(推荐)
name = 'Bob'
count = 5
f'Hello, {name}, you have {count} messages.'

要点:

  • 格式化是在 str 层面 做替换,与底层编码分离。
  • 真正写入文件、网络传输时,再统一用 UTF-8 编码成 bytes

6. 常见错误与避免方法

  • UnicodeEncodeError / UnicodeDecodeError

    • 原因:使用了 错误的编码名称默认编码与实际不符
    • 避免:
      • 读写文件时显式指定 encoding='utf-8'
      • 网络或协议中约定统一使用 UTF-8。
  • 乱码问题本质

    • 错误的编码方式解码 或者 错误地假设原数据的编码

7. 文件读写与编码

推荐统一使用 UTF-8:

with open('data.txt', 'w', encoding='utf-8') as f:
f.write('中文内容')

with open('data.txt', 'r', encoding='utf-8') as f:
text = f.read()

记忆要点:

  • 始终显式写出 encoding='utf-8'
  • IO 层负责和 bytes 打交道,程序中尽量只操作 str

8. 快速记忆总结

  • 一对核心类型str(Unicode 字符串)、bytes(字节序列)。
  • 三类常用函数
    • ord() / chr():字符 ↔ 码点
    • len()str 计字符,bytes 计字节
  • 两种关键操作
    • encode()strbytes
    • decode()bytesstr
  • 一个推荐标准:统一使用 UTF-8
  • 一个根本原则:编码、解码必须使用 同一种编码方式