我正在编写自己的字符串类(只是为了好玩),但我遇到了一些问题。我希望我的班级能够处理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
的简单性。例如。
我不确定如何正确地做到这一点。
答案 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”。