0

我正在编写自己的字符串类(只是为了好玩),但我遇到了一些问题。我希望我的班级能够同时处理 ASCII 和 Unicode 字符串。如果您将 a 分配const wchar_t*给我的班级,则会设置 Unicode 标志。如果您分配 a 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[]编辑,例如,这破坏了 std::string's 的简单性c_str

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

4

2 回答 2

2

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

这种方法将使您的类的使用变得简单。在我们的时代,我们有千兆字节的 RAM。这意味着除非您需要处理大量数据,否则这种方法听起来并不荒谬。

于 2012-10-10T02:29:48.293 回答
1

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

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

根据定义,如果 UTF-8 字符串不包含任何后 ASCII 字符,它就是 ASCII。因此,除非有人添加大于 127 的代码点,否则您的字符串是 ASCII。无需来回切换;您使用相同的字节数组处理它们。

此外,您似乎处于常见的 Windows 概念下,wchar_t*即“Unicode”和char*“ASCII”。他们不是。Unicode 是一种标准,用于描述 21 位代码点的含义以及它们之间的关系。21 位代码点可以以多种编码方式存储。您的“Unicode”可能意味着“UTF-16”。

于 2012-10-10T04:25:57.730 回答