使用字符串类编码二进制数据

Encoding binary data using string class

本文关键字:二进制 数据 编码 字符串      更新时间:2023-10-16

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

让我们假设标准库不存在,而我们专注于设计我们自己的字符串类。它将具有什么功能支持以及我们将改进哪些限制。让我们考虑一下以下因素。

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

我对以上文本的问题

  1. 作者所说的"二进制数据需要编码吗?"是什么意思。请举例说明我们如何实现这一点
  2. 第二点作者的意思是什么。请举例说明我们如何实现这一点

谢谢你的时间和帮助。

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

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

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


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

  1. 这里的问题是"我们可以在字符串中存储任何旧数据吗,或者某些字节值是否需要以某种特殊的方式编码。例如,在标准C语言中,如果你想使用换行符,它是"编码的"作为n,使其更可读、更清晰-当然,在这个例子中,我指的是源代码。如果二进制数据存储在字符串中,你将如何处理"奇怪"的数据-例如,零字节呢?它们需要特殊处理吗?

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

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