Python 字符编解码器

本文最后更新于:2022年8月10日 上午

“字符串”是个相当简单的概念:一个字符串是一个字符序列。本文记录 Python 中字符串相关内容。

基本的编解码器

  • Python 自带了超过 100 种编解码器(codec, encoder/decoder),用于在 文本和字节之间相互转换。每个编解码器都有一个名称,如 ‘utf_8’, 而且经常有几个别名,如 ‘utf8’、‘utf-8’ 和 ‘U8’。这些名称可以传 给 open()、str.encode()、bytes.decode() 等函数的 encoding 参数。

  • 例如:

    使用 3 个编解码器编码字符串“El Niño”,得到的字节序 列差异很大

    1
    2
    3
    4
    5
    6
    7
    for codec in ['latin_1', 'utf_8', 'utf_16']:
    print(codec, 'El Niño'.encode(codec), sep='\t')

    -->
    latin_1 b'El Ni\xf1o'
    utf_8 b'El Ni\xc3\xb1o'
    utf_16 b'\xff\xfeE\x00l\x00 \x00N\x00i\x00\xf1\x00o\x00'
  • 下图展示了不同编解码器对“A”和高音谱号等字符编码后得到的字节 序列。注意,后 3 种是可变长度的多字节编码。

  • 图 中的星号表明,某些编码(如 ASCII 和多字节的 GB2312)不能 表示所有 Unicode 字符。然而,UTF 编码的设计目的就是处理每一个 Unicode 码位。

  • 编码简介:

    编码名称 介绍
    latin1(即 iso8859_1) 一种重要的编码,是其他编码的基础,例如 cp1252 和 Unicode(注意,latin1 与 cp1252 的字节值是一样的,甚至连码位也相同)。
    cp1252 Microsoft 制定的 latin1 超集,添加了有用的符号,例如弯引号和 €(欧元);有些 Windows 应用把它称为“ANSI”,但它并不是 ANSI 标准。
    cp437 IBM PC 最初的字符集,包含框图符号。与后来出现的 latin1 不兼容。
    gb2312 用于编码简体中文的陈旧标准;这是亚洲语言中使用较广泛的多字节编码之一。
    utf-8 目前 Web 中最常见的 8 位编码; 与 ASCII 兼容(纯 ASCII 文本是 有效的 UTF-8 文本)。
    utf-16le UTF-16 的 16 位编码方案的一种形式;所有 UTF-16 支持通过转义 序列(称为“代理对”,surrogate pair)表示超过 U+FFFF 的码位。

参考资料


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