std::string,wstring,u16/32string澄清

13

我目前的理解是,std::stringstd::wstring之间的区别仅在于缓冲区的类型,即charwchar_t

我还读到过这样的说法:大多数(如果不是全部)Linux发行版都使用char作为所有字符串的类型,包括ASCII和UTF,而Windows是主要使用wchar_t的操作系统。

然而,还有一些字符串类型我希望能够搞清楚:u16stringu32string分别是具有2字节和4字节缓冲区的字符串。

所以,我的问题是:

sizeof(wchar_t) == 2的平台上,std::wstring是否与std::u16string功能上相同,在sizeof(wchar_t) == 4的平台上,是否与std::u32string相同?


这里有一个关于string/wstring的类似问题在SO上,链接为https://dev59.com/kHRC5IYBdhLWcg3wG9bp。 - Florea Marian
1
@FloreaMarian 并不完全一样 - 这个问题是在询问 stringwstring 之间的区别。我问的是,根据 wchar_t 的大小,wstring 是否与 u16stringu32string 相同。 - Qix - MONICA WAS MISTREATED
1
see http://utf8everywhere.org - Pavel Radzivilovsky
2
@PavelRadzivilovsky 两年后想感谢你那个链接。它完全改变了我设计软件的方式。 - Qix - MONICA WAS MISTREATED
1
我很开心!让我们传播更好的方式。http://utf8everywhere.org FTW :) - Pavel Radzivilovsky
1个回答

21

区别在于 charwchar_t 的细节是由实现定义的,而 char16_tchar32_t 的编码是由 C++11 标准明确定义的。

这意味着 wstring 很可能存储与 u16stringu32string 中的一个相同的数据,但我们不知道是哪一个。并且一些奇怪的实现允许它们全部不同,因为旧的 char 类型的大小和编码都未被标准定义。


1
wstring永远不会与其他字符串类型相同。标准要求wchar_t必须是与char16_tchar32_t不同的类型。实际上,它们可能具有相同的基础类型和相同的编码,但对于任何有效的C++实现,is_same<wstring, u16string>永远不会为true - Nicol Bolas
1
这里的“相同”意味着“在功能上等效”,就像问题中所说的那样。如果 sizeof(wchar_t) == 4,则使用 wstringu32string 很可能会得到相同的结果。 - Bo Persson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接