C++:wstring跨平台吗?

5

我目前在Windows上开发,但以后想让我的应用程序跨平台。它没有/不需要GUI。

我一直在使用wstrings,希望这是最好的解决方案。 我在项目设置中使用“多字节字符集”。

wstring在所有其他平台上都支持吗?


请参考这个答案中关于何时以及为什么使用它的好理由,但安迪的回答是正确的——它在规范中,因此应该是相当可移植的。 - Anya Shenanigans
5
它是便携式的,但你能够用它做的有用且可移植的事情很少。它仅仅被用于Windows API调用。可移植应用程序使用具有已知编码(例如UTF-8、UTF-16或UTF-32)的字符串。在不同平台上, wstring 具有不同的编码方式,因此毫无意义。请参考 http://www.utf8everywhere.org。 - Dietrich Epp
2个回答

5
即使其他平台支持std::wstring,它的定义和含义在不同平台上似乎是不同的:例如,在Windows上,wchar_tstd::wstring的基本“构建块”)大小为2字节,而在Linux上则为4字节。因此,在Windows上,可以使用std::wstringUTF-16格式存储Unicode字符串(这也是Win32 API使用的Unicode格式),但在Linux上,应该使用std::wstring来存储Unicode UTF-32字符串。所以,如果同一个类(std::wstring)在不同平台上有不同的含义,我不会将其定义为可移植的。如果要编写可移植的代码,可以考虑使用std::string并在其中存储Unicode UTF-8文本(实际上,std::string基于大小为1字节的char,在Windows和Linux上都是如此)。
或者,如果您可以使用新的C++11标准,您可能需要考虑使用std::u16string,它非常便携,因为它被定义为basic_string<char16_t>,所以可以在每个平台上用于存储Unicode UTF-16文本,而不会产生歧义。

1

wstring在其他平台上也支持吗?

应该是的。 std::wstring 是 C++ 输入/输出标准库的一部分,因此任何符合标准库规范的实现都必须提供它。

由于它是标准的 C++,使用 std::wstring 的程序可以保证可移植性 - 至少对于涉及 std::wstring 的使用而言是这样。


我在VS2010 IDE中应该使用哪种字符集?宽字符集可以吗?我想让cpp文件也跨平台。我通常不经常使用硬编码文本,但有时必须这样做。 - tmighty
@tmighty:在内部,Windows 使用 Unicode 字符集,因此使用多字节字符集将需要在每次调用处理字符串或字符的 Windows API 时进行从多字节到 Unicode 和反向的内部转换。我建议使用 Unicode 字符集。 - Andy Prowl
非常感谢。最后一个问题:我还没有尝试过。例如,XCode是否可以接受我在VS2010中创建的cpp文件? - tmighty
1
@tmighty:我不熟悉XCode,但如果那些cpp文件仅使用标准C++功能(包括核心语言和库,没有MS扩展,也没有Windows特定的头文件),那么应该可以。 - Andy Prowl
由于std::wstring基于wchar_t,而wchar_t在不同平台上具有_不同_的大小(例如,在Windows上为2个字节,在Linux上为4个字节),我不会将std::wstring定义为可移植的。C++11的新std::u16string是可移植的(如果OP想要在其中存储UTF-16文本)。 - Mr.C64

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