存在哪些C++字符串类/系统具有良好的unicode支持和良好的接口?

Mar*_* Ba 8 c++

在C++开发中使用字符串总是比Java或脚本语言等语言更复杂.我认为一些复杂性来自于C++中的性能焦点,有些只是历史性的.

我知道以下主要的字符串系统,并想知道是否有其他字符串以及它们相互之间有什么特别的缺点:

我承认没有明确的答案,但我认为SOs投票系统非常适合显示实际使用某个字符串系统的人的偏好(以及论证的有效性).


从答案中添加:

  • UFT8-CPP:http://utfcpp.sourceforge.net/

dan*_*n04 4

在 C++ 开发中使用字符串总是比在 Java 或脚本语言等语言中使用字符串要复杂一些。我认为一些复杂性来自于 C++ 中对性能的关注,有些只是历史性的。

我想说这都是历史的。特别是两段历史:

  • C 是在每个人(甚至日本)都使用 7 位或 8 位字符编码的时代开发的。因此,char“字节”和“字节”的概念完全混淆了。
  • C++ 程序员很快认识到拥有一个 string 类而不仅仅是 raw 的必要性char*。不幸的是,他们等了 15 年才正式标准化。与此同时,人们编写了他们自己的字符串类,我们今天仍然坚持使用它们。

无论如何,我使用了你提到的两个类:

MFC CString

MSDN 文档

实际上有两个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 函数。

主要缺点是:

  • 对于非常大的字符串,性能很慢。(无论如何,我上次检查过。)
  • 缺乏与 C++ 标准库的集成。没有迭代器,甚至没有<<用于>>流的迭代器。
  • 它仅适用于 Windows。

(自从我负责将代码移植到 Linux 以来,最后一点让我非常沮丧。我们公司编写了自己的字符串类,它是 CString 的克隆,但跨平台。)

std::basic_string

好处basic_string是它是标准。

它的缺点是它不支持 Unicode。OTOH,它并不是主动支持 Unicode,因为它缺少像upper()/lower()这样依赖于字符编码的成员函数。从这个意义上说,它实际上更像是“代码单元的动态数组”而不是“字符串”。

有一些库可以让你使用std::stringUTF-8,例如上面提到的UTF8-CPP和Poco库中的一些函数。

要了解要使用的字符大小,请参阅std::wstring 与 std::string