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

时间:2012-10-10 02:11:17

标签: c++ string unicode ascii

我正在编写自己的字符串类(只是为了好玩),但我遇到了一些问题。我希望我的班级能够处理ASCII和Unicode字符串。如果为我的类分配const wchar_t*,则设置Unicode标志。如果您指定const char*,则Unicode标记设置。

此外,如果您尝试将Unicode字符附加到ASCII字符串,它将创建一个全新的Unicode字符串,或者将重新分配其缓冲区并将所有内容转换为Unicode(不确定我将执行哪一个)

无论如何,在我的问题上:我想要类似于std :: string的c_str函数。显然我会有两个不同的函数,一个返回一个const char* ASCII字符串,另一个返回一个const wchar_t* Unicode字符串。

假设我的字符串是ASCII。如果我调用ToAsciiString()函数,它只会返回一个指向字符串内部存储的指针,该指针不会也不应该被手动释放,因为字符串dtor会自动执行该操作。

但如果我想用Unicode中的ASCII字符串,我可以调用ToUnicodeString()。但这会产生一个问题:我需要分配一个新的缓冲区来转换我的ASCII字符串。如果我这样做了,那么返回的指针需要手动delete[]编辑,这会破坏std :: string的c_str的简单性。例如。

我不确定如何正确地做到这一点。

2 个答案:

答案 0 :(得分:2)

我认为你应该能够在你的班级内维护2个缓冲区。在某些情况下,您只有一个,但如果两个表示都是必需的,则必须分配两个。

这种方法可以简化你的课程。在我们的日子里,我们有数十亿字节的RAM。这意味着除非你需要处理大量数据,否则这种方法听起来并不荒谬。

答案 1 :(得分:1)

  

我希望我的班级能够处理ASCII和Unicode字符串。

这接近问题都错了。如果您希望字符串包含ASCII或可能的Unicode字符,解决方案很简单:存储UTF-8。

根据定义,如果UTF-8字符串不包含任何后ASCII字符,则该字符串为ASCII。所以你的字符串是ASCII,除非有人添加一个大于127的代码点。不需要来回切换;你使用相同的字节数组处理它们。

此外,您似乎遵循常见的Windows版本概念,wchar_t*表示“Unicode”,char*表示“ASCII”。他们不是。 Unicode是一种标准,用于描述21位代码点的含义以及它们之间的关系。 21位代码点可以存储在各种编码中。你的“Unicode”可能意味着“UTF-16”。