返回介绍

字符串基础知识

发布于 2024-01-29 22:24:14 字数 2231 浏览 0 评论 0 收藏 0

在查看任何代码之前,让我们先开始概览一下Python的字符串模型。要理解为什么Python 3.0改变了字符串的工作方式,我们必须先简短地看看字符实际是如何在计算机中表示的。

字符编码方法

大多数程序员把字符串看作是用来表示文本数据的一系列字符。但是,根据必须记录何种字符集,计算机内存中存储字符的方式有所不同。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文