在C++开发中使用字符串总是比Java或脚本语言等语言更复杂.我认为一些复杂性来自于C++中的性能焦点,有些只是历史性的.
我知道以下主要的字符串系统,并想知道是否有其他字符串以及它们相互之间有什么特别的缺点:
我承认没有明确的答案,但我认为SOs投票系统非常适合显示实际使用某个字符串系统的人的偏好(以及论证的有效性).
从答案中添加:
在 C++ 开发中使用字符串总是比在 Java 或脚本语言等语言中使用字符串要复杂一些。我认为一些复杂性来自于 C++ 中对性能的关注,有些只是历史性的。
我想说这都是历史的。特别是两段历史:
char“字节”和“字节”的概念完全混淆了。char*。不幸的是,他们等了 15 年才正式标准化。与此同时,人们编写了他们自己的字符串类,我们今天仍然坚持使用它们。无论如何,我使用了你提到的两个类:
实际上有两个CString类:CStringA使用char“ANSI”编码,以及CStringW使用wchar_tUTF-16编码。 CString是其中之一的 typedef,具体取决于预处理器宏。( Windows 中的很多东西都有“ANSI”和“Unicode”版本。)
您可以将 UTF-8 用于char基于 的版本,但这存在 Microsoft 拒绝支持“UTF-8”作为 ANSI 代码页的问题。因此,Trim(const char* pszTargets)如果将诸如 之类的函数与非 ASCII 字符一起使用,它们依赖于识别字符边界的能力,则它们将无法正常工作。
由于本机支持 UTF-16,因此您可能更喜欢wchar_t基于 - 的版本。
这两个 CString 类都有一个相当方便的接口,包括一个类似 printf 的Format函数。由于该类的实现方式,还可以将CString 对象传递给此 varags 函数。
主要缺点是:
<<用于>>流的迭代器。(自从我负责将代码移植到 Linux 以来,最后一点让我非常沮丧。我们公司编写了自己的字符串类,它是 CString 的克隆,但跨平台。)
好处basic_string是它是标准。
它的缺点是它不支持 Unicode。OTOH,它并不是主动不支持 Unicode,因为它缺少像upper()/lower()这样依赖于字符编码的成员函数。从这个意义上说,它实际上更像是“代码单元的动态数组”而不是“字符串”。
有一些库可以让你使用std::stringUTF-8,例如上面提到的UTF8-CPP和Poco库中的一些函数。
要了解要使用的字符大小,请参阅std::wstring 与 std::string。