C++ 使用字符串类对二进制数据进行编码

C++ 使用字符串类对二进制数据进行编码,c++,C++,作为研究项目的一部分,我正在研究字符串实现的一个要求 让我们假设标准库不存在,而我们 专注于设计我们自己的字符串类。它有什么功能 支持以及我们将改进哪些限制。让我们考虑一下 以下因素 二进制数据需要编码吗 多字节字符编码可以接受还是需要unicode C风格的函数可以用来提供一些所需的功能吗 需要什么样的插入和提取操作 我对上述案文的问题 作者所说的“二进制数据需要编码吗?”是什么意思。请举例说明,以及我们如何实现这一点 作者的意思是什么。请举例说明,以及我们如何实现这一点 谢谢你的时间和帮助

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

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

  • 二进制数据需要编码吗
  • 多字节字符编码可以接受还是需要unicode
  • C风格的函数可以用来提供一些所需的功能吗
  • 需要什么样的插入和提取操作
  • 我对上述案文的问题

  • 作者所说的“二进制数据需要编码吗?”是什么意思。请举例说明,以及我们如何实现这一点
  • 作者的意思是什么。请举例说明,以及我们如何实现这一点
  • 谢谢你的时间和帮助

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

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

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

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

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

    这些是设计string类时需要考虑的问题



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

    我认为#1是在问,“字符串是否需要能够存储任意二进制数据?”。这将与常规C样式字符串形成对比,常规C样式字符串不能存储包含零值字节的数据,因为零值字符用于表示字符串的结尾。存储在字符串中的二进制数据是什么意思?您的解释基本正确,但至少有一个微妙的问题可能会引起混淆:它不是“多字节字符集”,而是“多字节编码”,只是意味着多个字节可以用来表示字符,但没有指定用于表示字符的字节数是固定的还是可变的。因此,所有各种Unicode编码都是多字节的,UTF-8是通常的可变长度编码(并且具有一个特殊特性,即它不仅是存储在一个字节中的“通用”字符,而且是ASCII字符编码,它指定了以7位存储的128个字符[并非所有可打印字符],因此允许与ASCII数据的互操作性)@venkysmarty:二进制数据-不是文本的东西。例如,使用“字符串”来存储编译器生成的机器代码,或者使用字符串作为多精度数学库的存储,存储π的6000位小数的二进制表示,或者诸如此类的内容。@JAB:我已经稍微改写了最后两段,希望这能使它更清晰一些。我不想让OP认为这个问题只有一个解决方案,tho'。为什么第一个字节字符的长度不保证为10