0

作为研究项目的一部分,我正在经历字符串实现的要求之一。

让我们假设标准库不存在,我们被迫设计自己的字符串类。它会支持哪些功能,我们会改进哪些限制。让我们考虑以下因素。

  1. 二进制数据是否需要编码?
  2. 多字节字符编码可以接受还是需要 unicode?
  3. 可以使用 C 风格的函数来提供一些需要的功能吗?
  4. 需要什么样的插入和提取操作?

我对上述文字的问题

  1. 作者所说的“二进制数据是否需要编码?”是什么意思。要求举例说明,我们如何实现这一点。
  2. 作者是什么意思 y 点 2. 请求以示例解释以及我们如何实现这一点。

感谢您的时间和帮助。

4

2 回答 2

0
  1. 这里的问题是“我们可以在字符串中存储任何旧数据,还是某些字节值需要以某种特殊方式编码。如果你想使用换行符,标准 C 语言就是一个例子,它被“编码”\n以使其更具可读性和清晰性-当然,在这个例子中我在源代码中谈论。对于存储在字符串中的二进制数据,您将如何处理“奇怪”数据——例如零字节呢?他们需要特殊处理吗?

  2. 保证适合 a 的值char是 ASCII 字符和其他一些字符(在典型实现中总共有 256 个不同的字符,但char标准不保证为 8 位)。但是,如果我们采用非欧洲语言,例如中文或日文,它们所包含的数量远远高于可容纳在单个语言中的数量。char. Unicode 允许使用数百万个不同的字符,因此来自任何欧洲、中文、日文、泰文、阿拉伯文、玛雅文和古代象形文字的任何字符都可以在一个“单元”中表示。这是通过使用更宽的字符来完成的——对于全尺寸,我们需要 32 位。这里的缺点是大多数时候,我们实际上并没有使用那么多不同的字符,所以为每个字符使用 32 位有点浪费,而几乎所有时间都在高 24 位中使用零。

多字节字符编码是一种折衷,其中“常见”字符(在欧洲语言中常见)被用作一个char,但不太常见的字符被编码为多个char值,使用特殊范围的字符来表示“在下一个char组合成一个单元”。(或者,可以决定每次使用 2、3 或 4char来编码单个字符)。

于 2013-07-23T12:54:29.200 回答
0

关于第一点,“二进制数据”是指字节序列,其中“字节”几乎总是意味着八位字。在过去,大多数系统都是基于 ASCII 的,它需要 7 位(或 8 位,取决于你问谁)。因此,没有必要区分字节和字符。这些天来,我们对非英语使用者更加友好,因此我们必须处理 Unicode(以及其他代码集)。这就提出了一个问题,即字符串类型需要处理字节和字符不再是同一事物的事实。

这涉及到第二点,即关于如何在程序中表示字符串。UTF-8 使用可变长度编码,它具有显着的特性,即它使用与 ASCII 编码完全相同的字节对整个 ASCII 字符集进行编码。但是,它使计算字符串中的字符数等变得更加困难。对于纯 ASCII,答案很简单:字符 = 字节。但是如果你的字符串可能有非 ASCII 字符,你现在必须遍历字符串,解码字符,以便找出有多少1

这些是您在设计字符串类时需要考虑的问题。


1这并不像看起来那么困难,因为每个字符的第一个字节保证在其两个高位中不包含 10。因此,您可以简单地计算满足(c & 0xc0) != 0xc0. 尽管如此,相对于仅将字符串缓冲区的长度视为其字符数而言,它仍然很昂贵。

于 2013-07-23T12:59:58.273 回答