我无法理解std::string和std::wstring之间的区别。我知道wstring支持Unicode字符等宽字符。我有以下问题:

什么时候应该使用std::wstring而不是std::string?std::string可以保存整个ASCII字符集,包括特殊字符吗?所有流行的C++编译器都支持std::wstring吗?什么是“宽字符”?


当前回答

1) 正如Greg所提到的,wstring有助于国际化,这意味着您将以英语以外的语言发布产品

4) 检查此项以获取宽字符http://en.wikipedia.org/wiki/Wide_character

其他回答

当您希望在字符串中存储宽字符时。宽取决于实现。如果我没记错的话,Visual C++默认为16位,而GCC默认值取决于目标。这里有32位长。请注意wchar_t(宽字符类型)与unicode无关。它只是保证它可以存储实现所支持的最大字符集的所有成员,并且至少可以存储char。也可以使用utf-8编码将unicode字符串精细地存储到std::string中。但它无法理解unicode代码点的含义。因此str.size()不会给出字符串中逻辑字符的数量,而只给出该字符串/wstring中存储的char或wchar_t元素的数量。出于这个原因,gtk/glib C++包装人员开发了一个可以处理utf-8的glib::ustring类。如果wchar_t是32位长,那么可以使用utf-32作为unicode编码,并且可以使用固定(utf-32是固定长度)编码来存储和处理unicode字符串。这意味着wstring的s.size()函数将返回正确数量的wchar_t元素和逻辑字符。是的,char总是至少8位长,这意味着它可以存储所有ASCII值。是的,所有主要的编译器都支持它。

要存储“宽”(Unicode)字符时。是:其中255个(不包括0个)。对这是一篇介绍性文章:http://www.joelonsoftware.com/articles/Unicode.html

当您希望使用Unicode字符串而不仅仅是ascii时,这有助于国际化是的,但它与0的配合不好没有意识到宽字符是编译器特有的处理unicode字符固定长度表示的方式,对于MSVC,它是2字节字符,对于gcc,我理解它是4字节。以及+1表示http://www.joelonsoftware.com/articles/Unicode.html

如果保持字符串的可移植性,则可以使用tstring,tchar。这是很久以前广泛使用的技术。在这个示例中,我使用了自定义的TCHAR,但您可以在internet上找到linux的TCHAR.h实现。

这个想法意味着windows上使用wstring/wchar_t/UTF-16,Linux上使用string/char/UTF-8(或ASCII..)。

在下面的示例中,英语/日语多字节混合字符串的搜索在两个windows/linux平台上都运行良好。

#include <locale.h>
#include <stdio.h>
#include <algorithm>
#include <string>
using namespace std;

#ifdef _WIN32
    #include <tchar.h>
#else
    #define _TCHAR char
    #define _T 
    #define _tprintf printf
#endif

#define tstring basic_string<_TCHAR>

int main() {
    setlocale(LC_ALL, "");
    tstring s = _T("abcあいうえおxyz");

    auto pos = s.find(_T("え"));
    auto r = s.substr(pos);
    _tprintf(_T("r=%s\n"), r.c_str());
}

我经常使用std::string来保存utf-8字符,而没有任何问题。我强烈建议在与使用utf-8作为本机字符串类型的API接口时这样做。

例如,当我的代码与Tcl解释器接口时,我使用utf-8。

主要的警告是std::字符串的长度,不再是字符串中的字符数。