作为学习项目的一部分,我正在完成字符串实现的一项要求。
让我们假设标准库不存在而且我们是 设计我们自己的字符串类。它有什么功能 支持以及我们将改进的限制。让我们考虑一下 以下因素。
- 二进制数据是否需要编码?
- 多字节字符编码是否可接受或是否需要unicode? li>
- 可以使用C风格的功能来提供一些所需的功能吗?
- 需要进行哪种插入和拔出操作?
醇>
关于上述文字的问题
感谢您的时间和帮助。
答案 0 :(得分:0)
这里的问题是“我们可以在字符串中存储任何旧数据,或者某些字节值是否需要以某种特殊方式进行编码。例如,如果您使用标准C语言想要使用换行符,它被“编码”为\n
以使其更具可读性和清晰度 - 当然,在这个例子中我在谈论源代码。在二进制数据存储的情况下字符串,你会如何处理“奇怪的”数据 - 例如零字节呢?他们需要特殊处理吗?
保证适合char
的值是ASCII字符和其他几个(典型实现中总共256个不同字符,但char
不保证为8位按标准)。但是,如果我们采用非欧洲语言,例如中文或日语,它们的数量远远高于可用于单一char
的语言。 Unicode允许数百万个不同的字符,因此任何欧洲,中国,日本,泰国,阿拉伯,玛雅和古代象形文字语言中的任何字符都可以用一个“单位”表示。这是通过使用更宽的字符来完成的 - 对于完整大小,我们需要32位。这里的缺点是,大多数情况下,我们实际上并没有使用那么多不同的字符,所以每个字符使用32位有点浪费,而且几乎所有时间都只有高位24位的零。
多字节字符编码是一种折衷方案,其中“常见”字符(在欧洲语言中很常见)用作一个char
,但不太常见的字符使用多个char
值进行编码,使用特殊范围的字符,表示“下一个char
中有更多数据合并为一个单元”。 (或者,每次可以决定使用2个,3个或4个char
来编码单个字符。)
答案 1 :(得分:0)
关于第一点,“二进制数据”是指字节序列,其中“字节”几乎总是指八位字。在过去,大多数系统都基于ASCII,这需要七位(或八位,取决于你问的人)。因此,无需区分字节和字符。现在,我们对非英语使用者更友好,因此我们必须处理Unicode(以及其他代码集)。这引发了字符串类型需要处理字节和字符不再相同的事实的问题。
这将分为第二点,即关于如何在程序中表示字符串的方法。 UTF-8使用可变长度编码,它具有显着的特性,即使用与ASCII编码使用的字节完全相同的字节对整个ASCII字符集进行编码。然而,这使得例如计算字符串中的字符数更加困难。对于纯ASCII,答案很简单:characters = bytes。但是如果你的字符串可能有非ASCII字符,你现在必须遍历字符串,解码字符,以便找出有多少 1 。
在设计字符串类时,需要考虑以下几类问题。
1 这并不像看起来那么困难,因为每个字符的第一个字节保证不会在其两个高位中有10个。因此,您可以简单地计算满足(c & 0xc0) != 0xc0
的字节数。尽管如此,相对于将字符串缓冲区的长度视为字符数而言,它仍然很昂贵。