自定义字符串类实现建议?
Posted
技术标签:
【中文标题】自定义字符串类实现建议?【英文标题】:Custom string class implementation advice? 【发布时间】:2012-10-10 02:11:16 【问题描述】:我正在编写自己的字符串类(只是为了好玩),但我遇到了一些问题。我希望我的班级能够同时处理 ASCII 和 Unicode 字符串。如果您将const wchar_t*
分配给我的班级,则设置了Unicode 标志。如果您分配 const char*
,则 Unicode 标志未设置。
此外,如果您尝试将 Unicode 字符附加到 ASCII 字符串,它将创建一个全新的 Unicode 字符串,或者将重新分配其缓冲区并将所有内容转换为 Unicode(不确定我会做什么) .
无论如何,关于我的问题:我想要类似于 std::string 的 c_str
函数的东西。显然我会有 2 个不同的函数,一个返回 const char*
ASCII 字符串,一个返回 const wchar_t*
Unicode 字符串。
假设我的字符串是 ASCII。如果我调用ToAsciiString()
函数,它只会返回一个指向字符串内部存储的指针,它不会也不应该被手动释放,因为字符串 dtor 会自动执行此操作。
但如果我想要 Unicode 格式的 ASCII 字符串,我可以调用 ToUnicodeString()
。但这会产生一个问题:我需要分配一个新缓冲区来将我的 ASCII 字符串转换为。如果我这样做了,那么返回的指针将需要手动delete[]
'ed,例如,这破坏了 std::string 的c_str
的简单性。
我不确定如何正确地做到这一点。
【问题讨论】:
Unicode 不是编码(UTF-8/UTF-16/UTF-32 是编码)。也许您希望字符串包含编码状态,并且任何新字符都必须包含它们的编码状态,并且它们被翻译为插入/附加等的一部分。 【参考方案1】:我认为您应该能够在班级内维护 2 个缓冲区。在某些情况下,您将只有一个,但如果两种表示都需要,则必须同时分配两者。
这种方法将使您的类的使用变得简单。在我们的时代,我们有千兆字节的 RAM。这意味着除非您需要处理大量数据,否则这种方法听起来并不荒谬。
【讨论】:
【参考方案2】:我希望我的班级能够同时处理 ASCII 和 Unicode 字符串。
这是完全错误的问题。如果您希望字符串包含 ASCII 或可能的 Unicode 字符,解决方案很简单:存储 UTF-8。
根据定义,如果 UTF-8 字符串不包含任何后 ASCII 字符,则它是 ASCII。因此,除非有人添加大于 127 的代码点,否则您的字符串是 ASCII。无需来回切换;你用相同的字节数组来处理它们。
此外,您似乎处于常见的 Windows 概念之下,即 wchar_t*
表示“Unicode”,char*
表示“ASCII”。他们不是。 Unicode 是一种标准,用于描述 21 位代码点的含义以及它们之间的关系。 21 位代码点可以以多种编码方式存储。您的“Unicode”可能意味着“UTF-16”。
【讨论】:
以上是关于自定义字符串类实现建议?的主要内容,如果未能解决你的问题,请参考以下文章