- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
字符串基础知识
字符编码方法
大多数程序员把字符串看作是用来表示文本数据的一系列字符。但是,根据必须记录何种字符集,计算机内存中存储字符的方式有所不同。
ASCII标准在美国创建,并且定义了大多数美国程序员使用的文本字符串表示法。ASCII定义了从0到127的字符代码,并且允许每个字符存储在一个8位的字节中(实际上,只有其中的7位真正用到)。例如,ASCII标准把字符'a'映射为整数值97(十六进制中的0x61),它存储在内存和文件的一个单个字节中。如果想要看到这是如何工作的,Python的内置函数ord给出了一个字符的二进制值,并且chr针对一个给定的整数代码值返回其字符:
然而,有时候每个字符一个字节并不够。例如,各种符号和重音字符并不在ASCII所定义的可能字符的范围中。为了容纳特殊字符,一些标准允许一个8位字节中的所有可能的值(即0到255)来表示字符,并且把(ASCII范围之外的)值128到255分配给特殊字符。这样的一个标准叫做Latin-1,广泛地用于西欧地区。在Latin-1中,127以上的字符代码分配给了重音和其他特殊字符。例如,分配给字节值196的字符,是一个特殊标记的非ASCII字符:
这个标准考虑到范围较广的额外特殊字符。然而,一些字母表定义了如此多的字符,以至于无法把其中的每一个都表示成一个字节。Unicode考虑到更多的灵活性。Unicode文本通常叫做“宽字符”字符串,因为每个字符可能表示为多个字节。Unicode通常用在国际化的程序中,以表示欧洲和亚洲的字符集,它们往往拥有比8位字节所能表示的更多的字符。
要在计算机内存中存储如此丰富的文本,我们要确保字符与原始字节之间可以使用一种编码相互转换,而编码就是把一个Unicode字符转换为字节序列以及从一个字节序列提取字符串的规则。更程序化地说,字节和字符串之间的来回转换由两个术语定义:
·编码是根据一个想要的编码名称,把一个字符串翻译为其原始字节形式。
·解码是根据其编码名称,把一个原始字节串翻译为字符串形式的过程。
也就是说,我们从字符串编码为原始字节,并且从原始字节解码为字符串。对于某些编码,翻译的过程很简单,例如ASCII和Latin-1,把每个字符映射为一个单个字节,因此,不需要翻译工作。对于其他的编码,映射可能更复杂些,并且每个字符产生多个字节。
例如,广为使用的UTF-8编码,通过采用可变的字节数的方案,允许表示众多的字符。小于128的字符代码表示为单个字节;128和0x7ff(2047)之间的代码转换为两个字节,而每个字节拥有一个128到255之间的值;0x7ff以上的代码转换为3个或4个字节序列,序列中的每个字节的值在128到255之间。这保持了ASCII字符串的紧凑,避免了字节排序问题,并且避免了可能对C库和网络连接引发问题的空(零)字节。
由于编码的字符映射把字符分配给同样的代码以保持兼容性,因此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只不过是考虑到了额外的字符:Latin-1是为了在一个字节内映射为128到255的值,UTF-8是考虑到可能用多个字节表示的字符串。其他的编码以类似的方式允许较宽的字符集合,但是,所有这些,ASCII、Latin-1、UTF-8以及很多其他的编码,都被认为是Unicode。
对于Python程序员来说,编码指定为包含了编码名的字符串。Python带有大约100种不同的编码,参见Python库参考可以找到一个完整的列表。导入encodings模块并运行help(encodings)也会显示很多的编码名称,一些是在Python中实现的,一些是在C中实现的。一些编码也有多个名称,例如,latin-1、iso_8859_1和8859都是相同编码的名称,即Latin-1。我们将会在本章稍后学习在脚本中编写Unicode字符串技术的时候,再次介绍编码。
要了解关于Unicode的更多内容,参见Python标准手册集。它在"Python HOWTOs"部分包括了一个"Unicode HOWTO",其中提供了额外的背景知识,考虑到篇幅的问题,我们暂时在此省略。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论