自定义字符串类实现建议?

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”。

【讨论】:

以上是关于自定义字符串类实现建议?的主要内容,如果未能解决你的问题,请参考以下文章

JVM 自定义类加载器

为自定义 Barrier 设计测试类

利用std::allocator实现自定义的vector类

ThinkPHP - 自定义扩展类库

java 如何让用户自定义函数呢?

创建QGis的自定义DataProvider