c++ - std::wstring VS std::string

  显示原文与译文双语对照的内容

我无法理解 std::stringstd::wstring 之间的区别。 我知道 wstring 支持宽字符,比如Unicode字符。 我有以下问题:

  1. 什么时候应该使用 std::wstring 超过 std::string
  2. std::string 是否可以保存整个ASCII字符集,包括特殊字符?
  3. std::wstring 是否受所有流行 C++ 编译器的支持?
  4. 什么是"宽字符"?
时间:

  1. 当你想将宽字符存储在字符串中时。 wide 依赖于实现。 如果我记错了,Visual C++ 默认为 16位,而GCC默认取决于目标。 这里是 32位长。 请注意 wchar_t ( 宽字符类型) 与unicode无关。 它只是保证它可以存储实现所支持的最大字符集的所有成员的所有成员,并且至少是 char 。 你可以 存储unicode字符串使用 utf-8 编码too,细分成 但是它不能理解unicode代码点的含义。 所以 str.size() 将不会给你的逻辑你在字符串中字符的数量,而只能char或者wchar_t元素存储在该字符串的数量/wstring 。 出于这个原因是,gtk/glib C++ 包装人开发了一个 Glib::ustring 类,该类可以处理 utf-8.

    使用一个固定的( utf-32是固定长度) encoding, 如果你 wchar_t 32是位长,那么你可以使用,并且可以存储 utf-32 作为一个unicode编码和处理 unicode strings. 这意味着你将 s.size() wstring的函数然后返回 wchar_t元素达到一定的量和逻辑字符。

  2. 是,char始终至少有 8位长,这意味着它可以存储所有的ASCII值。
  3. 是,所有主要编译器都支持它。

不满足 256个不同字符的应用程序具有使用宽字符( 超过 8位) 或者多字节编码( UTF-8 )的选项。 宽字符通常需要多于多字节编码的空间,但处理速度更快。 Multi-language的应用程序进程在处理大量文字通常使用宽字符,而是把它存储到磁盘时将它的转换为多字节编码的文本。

stringwstring 之间的区别是它们存储的字符的数据类型。 它的大小至少保证是一个字符串不仅储存 char的,因此你可以使用字符串进行处理 比如 8位 ASCII,ISO-8859-15或者UTF-8文本。 在字符集中未定义与 ascii, C++ 标准,但实际上每个编译器使用一个字符集,它的第一个字符 128 correspond. 使用UTF-8编码的编译器也是这种情况。

数据类型 wstring wchar_t 是,它的大小不是标准中定义的,除了它拥有至少与被大作为位 char,通常 16或者 32位。 wstring可以用于处理这里实现中的文本定义的wide-character编码。 所有当今流行的编译器都支持wstrings方法,但是因为中定义的字符类型已经被一个非常不精确的方法,但这不完全直接到在不同编码间转换。

如果不需要multi-language支持,只使用常规字符串就可以了。 另一方面,如果你正在编写一个图形应用程序,它这种情况经常出现这个API只支持宽字符。 那么在处理文本时,你应该使用相同的宽字符。 于写入disk,相关的问题就出现在需要将所使用的宽字符之间转换的用户界面API和( 例如) UTF-8编码中要使用的命令, 就很难做到通过移植的方式,但是同样,你的用户界面应用编程接口可能支持的转换。

...