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

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


当前回答

一个好问题!我认为数据编码(有时还涉及字符集)是一种内存表达机制,用于将数据保存到文件或通过网络传输数据,因此我将这个问题回答为:

1.何时应该使用std::wstring而不是std::string?

如果编程平台或API函数是单字节的,并且我们想要处理或解析一些Unicode数据,例如从Windows的.REG文件或网络2字节流中读取的数据,那么我们应该声明std::wstring变量以方便处理它们。例如:wstring ws=L“中国a“(6个八位字节内存:0x4E2D 0x56FD 0x0061),我们可以使用ws[0]获取字符'中' 和ws[1]获取字符'国' 和ws[2]获取字符“a”等。

2.std::string是否可以保存整个ASCII字符集,包括特殊字符?

对但请注意:美国ASCII,意味着每个0x00~0xFF八位字节代表一个字符,包括可打印文本,如“123abc&*_&”,您所说的特殊文本,大多打印为“”避免混淆编辑器或终端。还有一些国家扩展了自己的“ASCII”字符集,例如中文,使用2个八位字节来表示一个字符。

3.所有流行的C++编译器都支持std::wstring吗?

也许,或者大部分。我使用过:VC++6和GCC 3.3,是

4.什么是“宽字符”?

宽字符主要表示使用2个八位字节或4个八位字符来容纳所有国家的字符。2个八位字节UCS2是一个代表性示例,此外,例如英语“a”,其内存为0x0061的2个八位数(而ASCII“a”的内存为1个八位位0x61)

其他回答

一个好问题!我认为数据编码(有时还涉及字符集)是一种内存表达机制,用于将数据保存到文件或通过网络传输数据,因此我将这个问题回答为:

1.何时应该使用std::wstring而不是std::string?

如果编程平台或API函数是单字节的,并且我们想要处理或解析一些Unicode数据,例如从Windows的.REG文件或网络2字节流中读取的数据,那么我们应该声明std::wstring变量以方便处理它们。例如:wstring ws=L“中国a“(6个八位字节内存:0x4E2D 0x56FD 0x0061),我们可以使用ws[0]获取字符'中' 和ws[1]获取字符'国' 和ws[2]获取字符“a”等。

2.std::string是否可以保存整个ASCII字符集,包括特殊字符?

对但请注意:美国ASCII,意味着每个0x00~0xFF八位字节代表一个字符,包括可打印文本,如“123abc&*_&”,您所说的特殊文本,大多打印为“”避免混淆编辑器或终端。还有一些国家扩展了自己的“ASCII”字符集,例如中文,使用2个八位字节来表示一个字符。

3.所有流行的C++编译器都支持std::wstring吗?

也许,或者大部分。我使用过:VC++6和GCC 3.3,是

4.什么是“宽字符”?

宽字符主要表示使用2个八位字节或4个八位字符来容纳所有国家的字符。2个八位字节UCS2是一个代表性示例,此外,例如英语“a”,其内存为0x0061的2个八位数(而ASCII“a”的内存为1个八位位0x61)

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

我建议避免在Windows或其他地方使用std::wstring,除非接口需要,或者在Windows API调用和相应编码转换附近的任何地方使用。

我的观点总结在http://utf8everywhere.org我是其中的一位合著者。

除非您的应用程序是以API调用为中心的,例如主要是UI应用程序,否则建议将Unicode字符串存储为std::string并以UTF-8编码,在API调用附近执行转换。本文概述的好处超过了转换的明显烦恼,尤其是在复杂的应用程序中。对于多平台和图书馆开发来说,这是双重的。

现在,回答您的问题:

一些薄弱的原因。它的存在是出于历史原因,人们认为宽字符是支持Unicode的正确方式。它现在被用于接口更喜欢UTF-16字符串的API。我只在这些API调用的直接附近使用它们。这与std::string无关。它可以保存你放入的任何编码。唯一的问题是你如何对待它的内容。我的建议是UTF-8,因此它将能够正确保存所有Unicode字符。这是Linux上的常见做法,但我认为Windows程序也应该这样做。不宽字符是一个令人困惑的名称。在Unicode的早期,人们相信一个字符可以用两个字节编码,因此得名。今天,它代表“字符的任何两个字节长的部分”。UTF-16被视为此类字节对的序列(也称为宽字符)。UTF-16中的字符采用一对或两对。

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

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

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