(3) 阅读 (5661)

字符串 编辑

词条创建者 匿名用户

什么是字符串

编辑

计算机编程中,字符串传统上是一个字符序列,可以是字面常量,也可以是某种变量。后者可能允许其元素发生变异并改变长度,或者它可能是固定的(在创建之后)。字符串通常被认为是一种数据类型,通常被实现为字节(或单词)的数组数据结构,它使用某种字符编码存储一系列元素,通常是字符。字符串也可以表示更通用的数组或其他序列(或列表)数据类型和结构。

根据所使用的编程语言和精确的数据类型,声明为字符串的变量可能会导致内存中的存储被静态分配给预定的xxx长度,或者采用动态分配来允许它保存可变数量的元素。

当一个字符串在源代码中按字面意思出现时,它被称为字符串文字或匿名字符串。

在数学逻辑和理论计算机科学中使用的形式语言中,字符串是从称为字母表的集合中选择的有限符号序列。

字符串数据类型

编辑

字符串数据类型是根据正式字符串的概念建模的数据类型。字符串是如此重要和有用的数据类型,几乎所有编程语言都实现了它们。在某些语言中,它们可用作原始类型,而在其他语言中可用作复合类型。大多数高级编程语言的语法允许通常以某种方式引用的字符串来表示字符串数据类型的实例。这样的元字符串称为文字或字符串文字。

字符串长度

尽管形式字符串可以具有任意有限长度,但实际语言中字符串的长度通常被限制为人为的xxx值。一般来说,有两种类型的字符串数据类型:固定长度的字符串,它具有在编译时确定的固定xxx长度,并且无论是否需要这个xxx值都使用相同的内存量,以及可变长度的字符串,其长度不是任意固定的,并且可以根据运行时的实际需求使用不同数量的内存(请参阅内存管理)。现代编程语言中的大多数字符串都是变长字符串。当然,即使是可变长度的字符串也有长度限制——受可用的大小电脑内存。字符串长度可以存储为单独的整数(这可能会对长度施加另一个人为限制)或通过终止字符隐式存储,通常是所有位为零的字符值,例如在C编程语言中。另请参阅下面的“空终止”。

字符编码

字符串数据类型在历史上为每个字符分配一个字节,尽管确切的字符集因区域而异,但字符编码非常相似,程序员通常可以忽略这一点,因为程序特殊处理的字符(例如句点、空格和逗号)在程序遇到的所有编码中都在同一个位置。这些字符集通常基于ASCII或EBCDIC。如果一种编码的文本在使用不同编码的系统上显示,则文本通常会被损坏,尽管通常有些可读性,并且一些计算机用户学会了阅读损坏的文本。

诸如中文、日文和韩文(统称为CJK)等语标语言需要远远超过256个字符(每个字符编码一个8位字节的限制)才能合理表示。正常的解决方案包括为ASCII保留单字节表示并为CJK表意文字使用两字节表示。将这些与现有代码一起使用会导致字符串匹配和切割问题,其严重程度取决于字符编码的设计方式。一些编码,例如EUCfamily保证ASCII范围内的字节值将仅表示该ASCII字符,从而使编码对于使用这些字符作为字段分隔符的系统是安全的。其他编码(例如ISO-2022和Shift-JIS)不提供此类保证,从而导致字节码匹配不安全。这些编码也不是“自同步”的,因此定位字符边界需要备份到字符串的开头,并且将两个字符串粘贴在一起可能会导致第二个字符串损坏。

Unicode稍微简化了图片。大多数编程语言现在都有Unicode字符串的数据类型。Unicode的首选字节流格式UTF-8被设计为不存在上述旧多字节编码的问题。UTF-8、UTF-16和UTF-32要求程序员知道固定大小的代码单元不同于“字符”,目前的主要困难是试图隐藏这种差异的错误设计的API(UTF-32确实使代码点固定大小,但由于组成代码,这些不是“字符”)。

实现

某些语言,例如C++和Ruby,通常允许在创建字符串后更改其内容;这些被称为可变字符串。在其他语言中,例如Java和Python,该值是固定的,如果要进行任何更改,则必须创建一个新字符串;这些被称为不可变字符串(其中一些语言还提供了另一种可变类型,例如Java和.NETStringBuilder、线程安全的JavaStringBuffer和CocoaNSMutableString)。

字符串通常实现为字节、字符或代码单元的数组,以允许快速访问单个单元或子字符串——包括具有固定长度的字符。一些语言,如Haskell,将它们实现为链表。

某些语言,例如Prolog和Erlang,根本避免实现专用的字符串数据类型,而是采用将字符串表示为字符代码列表的约定。

表示

字符串的表示在很大程度上取决于字符库的选择和字符编码的方法。较旧的字符串实现旨在使用由ASCII或更新的扩展(如ISO8859系列)定义的曲目和编码。现代实现通常使用由Unicode定义的广泛的曲目以及各种复杂的编码,例如UTF-8和UTF-16。

术语字节串通常表示通用的字节串,而不是仅(可读)字符的串、位串等。字节字符串通常意味着字节可以取任何值,并且任何数据都可以按原样存储,这意味着不应该有任何值被解释为终止值。

大多数字符串实现非常类似于可变长度数组,其中条目存储相应字符的字符代码。主要区别在于,对于某些编码,单个逻辑字符可能会占用数组中的多个条目。例如,UTF-8会发生这种情况,其中单个代码(UCS代码点)可以占用一到四个字节,单个字符可以占用任意数量的代码。在这些情况下,字符串的逻辑长度(字符数)与数组的物理长度(使用的字节数)不同。UTF-32避免了问题的xxx部分。

空终止

可以使用特殊的终止字符隐式存储字符串的长度;这通常是空字符(NUL),它的所有位都为零,这是流行的C编程语言使用和延续的约定。因此,这种表示通常被称为C字符串。这种n字符字符串的表示占用n+1个空格(1表示终止符),因此是一个隐式数据结构。

在终止字符串中,终止代码不是任何字符串中允许的字符。带有长度字段的字符串没有这个限制,也可以存储任意二进制数据。

字节和位终止

使用除null之外的特殊字节来终止字符串在历史上已经出现在硬件和软件中,尽管有时它的值也是一个打印字符。$被许多汇编系统:使用,被CDC系统使用(这个字符的值为零),并且ZX80使用\\\"因为这是其BASIC语言中的字符串分隔符。

有点类似,像IBM1401这样的“数据处理”机器使用特殊的字标记位在左侧分隔字符串,操作将从右侧开始。该位必须在字符串的所有其他部分中清除。这意味着,尽管IBM1401有一个7位字,但几乎没有人想过将其用作一项功能,并覆盖第七位的分配以(例如)处理ASCII代码。

早期的微型计算机软件依靠ASCII码不使用高位这一事实,并将其设置为指示字符串的结尾。它必须在输出前复位为0。

长度前缀

字符串的长度也可以显式存储,例如通过在字符串前面加上长度作为字节值。这种约定用于许多帕斯卡方言;因此,有些人称这样的字符串为Pascal字符串或P-string。将字符串长度存储为字节会将xxx字符串长度限制为255。为避免此类限制,P字符串的改进实现使用16、32或64位字来存储字符串长度。当长度字段覆盖地址空间时,字符串仅受可用内存的限制。

如果长度是有界的,那么它可以在常量空间中编码,通常是一个机器字,从而导致一个隐式数据结构,占用n+k空间,其中k是一个字中的字符数(8表示8位ASCII在64位机器上,1代表32位UTF-32/UCS-4在32位机器上,等等)。如果长度无界,编码长度为n占用log(n)空间(参见固定长度代码),因此长度前缀字符串是一种简洁的数据结构,在log(n)+n空间中编码长度为n的字符串.

文字字符串

编辑

有时,字符串需要嵌入到文本文件中,该文件既可供人类阅读,又可供机器使用。这在例如编程语言的源代码或配置文件中是必需的。在这种情况下,NUL字符不能很好地用作终止符,因为它通常是不可见的(不可打印)并且难以通过键盘输入。存储字符串长度也很不方便,因为手动计算和跟踪长度既繁琐又容易出错。

字符串

两种常见的表示是:

  • 用引号括起来(ASCII0x22双引号或ASCII0x27单引号),被大多数编程语言使用。为了能够包含特殊字符,例如引号本身、换行符或不可打印字符,通常可以使用转义序列,通常以反斜杠字符(ASCII0x5C)为前缀。
  • 由换行符终止,例如在WindowsINI文件中。

非文本字符串

编辑

虽然字符串是字符串的常见用法,但计算机科学中的字符串通常指的是任何同质类型数据的序列。例如,位串或字节串可用于表示从通信介质检索的非文本二进制数据。根据应用程序的需要、程序员的愿望以及所使用的编程语言的能力,这些数据可能会或可能不会由特定于字符串的数据类型表示。如果编程语言的字符串实现不是8-bitclean,可能会导致数据损坏。

C程序员在“字符串”(也称为“字符串”)与“字节字符串”或“伪字符串”(可以存储在同一个数组中但通常不会以null终止。在这样的“字节字符串”上使用C字符串处理函数通常似乎可行,但后来会导致安全问题。

字符串处理算法

编辑

处理字符串的算法有很多种,每种算法都有不同的取舍。可以根据运行时间、存储要求等分析竞争算法。

一些类别的算法包括:

高级字符串算法通常采用复杂的机制和数据结构,其中包括后缀树和有限状态机。


内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/131722/

发表评论

登录后才能评论

词条目录
  1. 什么是字符串
  2. 字符串数据类型
  3. 字符串长度
  4. 字符编码
  5. 实现
  6. 表示
  7. 空终止
  8. 字节和位终止
  9. 长度前缀
  10. 文字字符串
  11. 非文本字符串
  12. 字符串处理算法

轻触这里

关闭目录

目录