Python学习手册(第4版) 中文版.pdf
《Python学习手册(第4版) 中文版.pdf》由会员分享,可在线阅读,更多相关《Python学习手册(第4版) 中文版.pdf(1162页珍藏版)》请在文库网上搜索。
1、第 八 部 分 高 级 话 题893 第36 章 Unicode 和 字 节 字 符 串 在 本 书 的 核 心 类 型 部 分 关 于 字 符 串 的 一 章 中 ( 第7 章 ) , 我 有 意 地 限 制 了 大 多 数Python 程 序 员 需 要 了 解 的 字 符 串 话 题 的 子 集 的 范 围 。 因 为 大 多 数 程 序 员 只 是 处 理 像ASCII 这 样 的 文 本 的 简 单 形 式 , 他 们 快 乐 地 使 用 着Python 的 基 本 的str 字 符 串 类 型 及 其 相 关 的 操 作 , 并 且 不 需 要 掌 握 更 加 高 级 的 字 符
2、串 概 念 。 实 际 上 , 这 样 的 程 序 员 很 大 程 度 上 可 以 忽 略 Python 3.0 中 的 字 符 串 的 变 化 , 并 且 继 续 使 用 他 们 过 去 所 使 用 的 字 符 串 。 另 一 方 面 , 一 些 程 序 员 处 理 更 加 专 业 的 数 据 类 型 : 非A S C I I 的 字 符 串 集 、 图 像 文 件 内 容 , 等 等 。 对 于 这 些 程 序 员 ( 以 及 其 他 可 能 某 一 天 加 入 这 一 队 伍 的 程 序 员 ) , 在 本 章 中 , 我 们 将 介 绍Python 字 符 串 的 其 他 内 容 ,
3、并 且 探 讨Python 字 符 串 模 型 中 一 些 较 为 高 级 的 话 题 。 特 别 是 , 我 们 将 介 绍Python 支 持 的Unicode 文 本 的 基 础 知 识 在 国 际 化 应 用 程 序 中 使 用 的 宽 字 符 字 符 串 , 以 及 二 进 制 数 据 表 示 绝 对 的 字 节 值 的 字 符 串 。 我 们 将 看 到 , 高 级 的 字 符 串 表 示 法 在Python 当 前 版 本 中 已 经 产 生 了 分 歧 : Python 3.0 为 二 进 制 数 据 提 供 了 一 种 替 代 字 符 串 类 型 , 并 且 在 其 常 规
4、的 字 符 串 类 型 中 支 持Unicode 文 本 (ASCII 看 作Unicode 的 一 种 简 单 类 型 ) 。 Python 2.6 为 非ASCII Unicode 文 本 提 供 了 一 种 替 代 字 符 串 类 型 , 并 且 在 其 常 规 的 字 符 串 类 型 中 支 持 简 单 文 本 和 二 进 制 数 据 。 此 外 , 由 于Python 的 字 符 串 模 式 对 于 如 何 处 理 非ASCII 文 件 有 着 直 接 的 影 响 , 我 们 还 将 在 这 里 介 绍 相 关 话 题 的 基 础 知 识 。 最 后 , 我 们 还 将 简 单 地
5、看 看 一 些 高 级 字 符 串 和 二 进 制 工 具 , 例 如 模 式 匹 配 、 对 象pickle 化 、 二 进 制 数 据 包 装 和XML 解 析 , 以 及Python 3.0 的 字 符 串 变 化 对 它 们 产 生 影 响 的 方 式 。 894 第36 章 正 式 来 说 , 本 章 是 关 于 高 级 话 题 的 一 章 , 因 为 并 不 是 所 有 的 程 序 员 都 需 要 深 入Unicode 编 码 或 二 进 制 数 据 的 世 界 。 如 果 你 需 要 关 注 处 理 这 两 种 形 式 , 那 么 , 你 将 会 发 现Python 的 字 符
6、串 模 式 提 供 了 所 需 的 支 持 。 Python 3.0 中 的 字 符 串 修 改 Python 3.0 中 最 引 入 注 目 的 修 改 之 一 , 就 是 字 符 串 对 象 类 型 的 变 化 。 简 而 言 之 ,Python 2.X 的str 和unicode 类 型 已 经 融 入 了Python 3.0 的str 和bytes 类 型 , 并 且 增 加 了 一 种 新 的 可 变 的 类 型bytearray 。bytearray 类 型 在Python 2.6 中 也 可 以 使 用 ( 但 在 更 早 的 版 本 中 不 能 用 ) , 但 是 , 它 在P
7、ython 3.0 中 得 到 完 全 支 持 , 并 且 不 像 是Python 2.6 中 那 样 清 楚 地 区 分 文 本 和 二 进 制 内 容 。 特 别 是 , 如 果 我 们 处 理 本 质 上 是Unicode 或 二 进 制 的 数 据 , 这 些 修 改 对 于 代 码 可 能 会 有 切 实 的 影 响 。 实 际 上 , 作 为 首 要 的 一 般 性 规 则 , 我 们 需 要 如 何 关 注 这 一 话 题 , 很 大 程 度 上 取 决 于 遇 到 如 下 的 哪 种 情 况 : 如 果 处 理 非ASCII Unicode 文 本 , 例 如 , 在 国 际
8、化 应 用 程 序 或 某 些XML 解 析 器 的 结 果 这 样 的 环 境 中 , 你 将 会 发 现Python 3.0 中 对 文 本 编 码 的 支 持 是 不 同 的 , 但 是 可 能 比Python 2.6 中 的 支 持 更 加 直 接 、 易 用 和 无 缝 。 如 果 处 理 二 进 制 数 据 , 例 如 , 使 用struct 模 块 处 理 的 图 形 或 音 频 文 件 的 形 式 或 打 包 的 数 据 , 我 们 需 要 理 解Python 3.0 中 新 的bytes 对 象 , 以 及Python 3.0 对 文 本 和 二 进 制 数 据 和 文 件
9、的 不 同 和 严 格 区 分 。 如 果 不 属 于 前 面 两 种 情 况 的 任 何 一 种 , 在Python 3.0 中 , 通 常 可 以 像 是 在Python 2.6 中 一 样 使 用 字 符 串 : 使 用 通 用 的s t r 字 符 串 类 型 、 文 本 文 件 , 以 及 我 们 前 面 所 介 绍 的 所 有 熟 悉 的 字 符 串 操 作 。 字 符 串 将 使 用 平 台 默 认 的 编 码 来 进 行 编 码 和 解 码 ( 例 如 , 美 国 的Windows 上 的ASCII 或UTF-8 , 如 果 我 们 仔 细 检 查 的 话 ,sys. getd
10、efaultencoding() 给 出 默 认 的 编 码 方 式 ) , 但 是 , 你 可 能 不 会 注 意 。 换 句 话 说 , 如 果 你 的 文 本 总 是ASCII , 可 以 使 用 常 规 的 字 符 串 对 象 和 文 本 文 件 , 并 且 避 免 下 面 介 绍 的 大 多 数 情 况 。 正 如 稍 后 我 们 将 见 到 的 ,ASCII 是 一 种 简 单 的Unicode , 并 且 是 其 他 编 码 的 一 个 子 集 , 因 此 , 如 果 你 的 程 序 处 理ASCII 文 本 , 字 符 串 操 作 和 文 件 “ 刚 好 够 用 ” 。 即 便
11、 你 遇 到 了 刚 刚 提 及 的3 种 情 况 的 最 后 一 种 , 然 而 对Python 3.0 字 符 串 模 式 的 基 本 理 解 , 既 可 以 帮 助 你 理 解 一 些 底 层 的 行 为 , 也 可 以 帮 助 你 更 容 易 地 掌 握Unicode 或 二 进 制 数 据 问 题 , 以 免 它 们 将 来 会 影 响 到 你 。 Unicode 和字节字符串 895 Python 3.0 对Unicode 和 二 进 制 数 据 的 支 持 在Python 2.6 中 也 可 以 使 用 , 虽 然 形 式 不 同 。 尽 管 本 章 中 主 要 关 注 的 是P
12、ython 3.0 中 的 字 符 串 类 型 , 在 此 过 程 中 , 我 们 还 将 讨 论 一 些 Python 2.6 中 的 不 同 之 处 。 不 管 你 使 用 的 是 哪 个 版 本 , 我 们 在 这 里 介 绍 的 工 具 在 很 多 类 型 程 序 中 将 变 得 重 要 起 来 。 字 符 串 基 础 知 识 在 查 看 任 何 代 码 之 前 , 让 我 们 先 开 始 概 览 一 下P y t h o n 的 字 符 串 模 型 。 要 理 解 为 什 么 Python 3.0 改 变 了 字 符 串 的 工 作 方 式 , 我 们 必 须 先 简 短 地 看 看
13、 字 符 实 际 是 如 何 在 计 算 机 中 表 示 的 。 字 符 编 码 方 法 大 多 数 程 序 员 把 字 符 串 看 作 是 用 来 表 示 文 本 数 据 的 一 系 列 字 符 。 但 是 , 根 据 必 须 记 录 何 种 字 符 集 , 计 算 机 内 存 中 存 储 字 符 的 方 式 有 所 不 同 。 ASCII 标 准 在 美 国 创 建 , 并 且 定 义 了 大 多 数 美 国 程 序 员 使 用 的 文 本 字 符 串 表 示 法 。ASCII 定 义 了 从0 到127 的 字 符 代 码 , 并 且 允 许 每 个 字 符 存 储 在 一 个8 位 的
14、 字 节 中 ( 实 际 上 , 只 有 其 中 的7 位 真 正 用 到 ) 。 例 如 ,A S C I I 标 准 把 字 符a 映 射 为 整 数 值97 ( 十 六 进 制 中 的0x61 ) , 它 存 储 在 内 存 和 文 件 的 一 个 单 个 字 节 中 。 如 果 想 要 看 到 这 是 如 何 工 作 的 , Python 的 内 置 函 数ord 给 出 了 一 个 字 符 的 二 进 制 值 , 并 且chr 针 对 一 个 给 定 的 整 数 代 码 值 返 回 其 字 符 : ord(a) # a is a byte with binary value 97 i
15、n ASCII 97 hex(97) 0x61 chr(97) # Binary value 97 stands for character a a 然 而 , 有 时 候 每 个 字 符 一 个 字 节 并 不 够 。 例 如 , 各 种 符 号 和 重 音 字 符 并 不 在ASCII 所 定 义 的 可 能 字 符 的 范 围 中 。 为 了 容 纳 特 殊 字 符 , 一 些 标 准 允 许 一 个8 位 字 节 中 的 所 有 可 能 的 值 ( 即0 到255 ) 来 表 示 字 符 , 并 且 把 (ASCII 范 围 之 外 的 ) 值128 到255 分 配 给 特 殊 字
16、符 。 这 样 的 一 个 标 准 叫 做Latin-1 , 广 泛 地 用 于 西 欧 地 区 。 在Latin-1 中 ,127 以 上 的 字 符 代 码 分 配 给 了 重 音 和 其 他 特 殊 字 符 。 例 如 , 分 配 给 字 节 值196 的 字 符 , 是 一 个 特 殊 标 记 的 非ASCII 字 符 : 0xC4 196 chr(196) 896 第36 章 这 个 标 准 考 虑 到 范 围 较 广 的 额 外 特 殊 字 符 。 然 而 , 一 些 字 母 表 定 义 了 如 此 多 的 字 符 , 以 至 于 无 法 把 其 中 的 每 一 个 都 表 示 成
17、 一 个 字 节 。Unicode 考 虑 到 更 多 的 灵 活 性 。Unicode 文 本 通 常 叫 做 “ 宽 字 符 ” 字 符 串 , 因 为 每 个 字 符 可 能 表 示 为 多 个 字 节 。Unicode 通 常 用 在 国 际 化 的 程 序 中 , 以 表 示 欧 洲 和 亚 洲 的 字 符 集 , 它 们 往 往 拥 有 比8 位 字 节 所 能 表 示 的 更 多 的 字 符 。 要 在 计 算 机 内 存 中 存 储 如 此 丰 富 的 文 本 , 我 们 要 确 保 字 符 与 原 始 字 节 之 间 可 以 使 用 一 种 编 码 相 互 转 换 , 而 编
18、 码 就 是 把 一 个Unicode 字 符 转 换 为 字 节 序 列 以 及 从 一 个 字 节 序 列 提 取 字 符 串 的 规 则 。 更 程 序 化 地 说 , 字 节 和 字 符 串 之 间 的 来 回 转 换 由 两 个 术 语 定 义 : 编 码 是 根 据 一 个 想 要 的 编 码 名 称 , 把 一 个 字 符 串 翻 译 为 其 原 始 字 节 形 式 。 解 码 是 根 据 其 编 码 名 称 , 把 一 个 原 始 字 节 串 翻 译 为 字 符 串 形 式 的 过 程 。 也 就 是 说 , 我 们 从 字 符 串 编 码 为 原 始 字 节 , 并 且 从
19、原 始 字 节 解 码 为 字 符 串 。 对 于 某 些 编 码 , 翻 译 的 过 程 很 简 单 , 例 如ASCII 和Latin-1 , 把 每 个 字 符 映 射 为 一 个 单 个 字 节 , 因 此 , 不 需 要 翻 译 工 作 。 对 于 其 他 的 编 码 , 映 射 可 能 更 复 杂 些 , 并 且 每 个 字 符 产 生 多 个 字 节 。 例 如 , 广 为 使 用 的UTF-8 编 码 , 通 过 采 用 可 变 的 字 节 数 的 方 案 , 允 许 表 示 众 多 的 字 符 。 小 于128 的 字 符 代 码 表 示 为 单 个 字 节 ;128 和0x
20、7ff (2047) 之 间 的 代 码 转 换 为 两 个 字 节 , 而 每 个 字 节 拥 有 一 个128 到255 之 间 的 值 ;0x7ff 以 上 的 代 码 转 换 为3 个 或4 个 字 节 序 列 , 序 列 中 的 每 个 字 节 的 值 在128 到255 之 间 。 这 保 持 了ASCII 字 符 串 的 紧 凑 , 避 免 了 字 节 排 序 问 题 , 并 且 避 免 了 可 能 对C 库 和 网 络 连 接 引 发 问 题 的 空 ( 零 ) 字 节 。 由 于 编 码 的 字 符 映 射 把 字 符 分 配 给 同 样 的 代 码 以 保 持 兼 容 性
21、, 因 此ASCII 是Latin-1 和 UTF-8 的 子 集 。 也 就 是 说 , 一 个 有 效 的ASCII 字 符 串 也 是 一 个 有 效 的Latin-1 和UTF-8 编 码 字 符 串 。 当 数 据 存 储 到 文 件 中 的 时 候 , 这 也 是 成 立 的 : 每 个ASCII 文 件 也 是 有 效 的UTF-8 文 件 , 因 为ASCII 是UTF-8 的 一 个7 位 的 子 集 。 反 过 来 , 对 于 所 有 小 于128 的 字 符 代 码 ,UTF-8 编 码 与ASCII 是 二 进 制 兼 容 的 。Latin-1 和UTF-8 只 不 过
22、 是 考 虑 到 了 额 外 的 字 符 :Latin-1 是 为 了 在 一 个 字 节 内 映 射 为128 到255 的 值 ,UTF-8 是 考 虑 到 可 能 用 多 个 字 节 表 示 的 字 符 串 。 其 他 的 编 码 以 类 似 的 方 式 允 许 较 宽 的 字 符 集 合 , 但 是 , 所 有 这 些 ,ASCII 、Latin-1 、UTF-8 以 及 很 多 其 他 的 编 码 , 都 被 认 为 是Unicode 。 对 于Python 程 序 员 来 说 , 编 码 指 定 为 包 含 了 编 码 名 的 字 符 串 。Python 带 有 大 约100 种
23、不 同 的 编 码 , 参 见Python 库 参 考 可 以 找 到 一 个 完 整 的 列 表 。 导 入encodings 模 块 并 运 行 help(encodings) 也 会 显 示 很 多 的 编 码 名 称 , 一 些 是 在Python 中 实 现 的 , 一 些 是 在C 中 实 现 的 。 一 些 编 码 也 有 多 个 名 称 , 例 如 ,latin-1 、iso_8859_1 和8859 都 是 相 同 编 码 的 名 Unicode 和字节字符串 897 称 , 即Latin-1 。 我 们 将 会 在 本 章 稍 后 学 习 在 脚 本 中 编 写Unicod
24、e 字 符 串 技 术 的 时 候 , 再 次 介 绍 编 码 。 要 了 解 关 于Unicode 的 更 多 内 容 , 参 见Python 标 准 手 册 集 。 它 在 “Python HOWTOs ” 部 分 包 括 了 一 个 “Unicode HOWTO ” , 其 中 提 供 了 额 外 的 背 景 知 识 , 考 虑 到 篇 幅 的 问 题 , 我 们 暂 时 在 此 省 略 。 Python 的 字 符 串 类 型 具 体 来 说 ,Python 语 言 提 供 了 字 符 串 类 型 在 脚 本 中 表 示 字 符 文 本 。 在 脚 本 中 所 使 用 的 字 符 串
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 学习 手册 中文版