首页 > 解决方案 > 为什么 STL “正式”不支持 std::string 到 std::wstring 的转换?

问题描述

我知道std::string并且std::wstring来自相同的基本类型std::basic_string<>。但是没有一种“官方”的方式可以将std::string数据转换为std::wstring使用 C++ STL?我的意思是 Windows 提供MultiByteToWideChar()转换,但为什么 STL 不能提供转换?

std::codecvt以前用来完成它,但现在它说它已被弃用。为什么STL首先删除了这个支持?

提前致谢。

标签: c++string

解决方案


字符编码不是std::stringC++标准定义的,astd::string可以保存任何可以用1字节char元素表示的编码,包括UTF-7/8、ISO-8859-x、Windows-125x等。

此外, 的大小wchar_t实现定义的,不是由标准定义的,所以即使 的编码std::wstring可以变化。在 Windows 上,wchar_t是 2 个字节,因此std::wstring使用 UCS-2/UTF-16 编码。而在其他平台上,wchar_t是 4 个字节,所以std::wstring使用 UCS-4/UTF-32。

因此,没有一种单一的转换可以满足std::string <-> std::wstring所有平台和用例中所有可能的转换组合。因此,您需要知道源字符串的编码以及目标字符串的预期编码,才能执行转换。

是的,C++ 标准确实为这项任务提供了std::codecvtstd::wstring_convert/ std::wbuffer_convert,但正如您所指出的,它们已被弃用。没有提供标准替代品(还没有?)。

因此,您最好使用 3rd 方 Unicode API/库来处理字符转换。


推荐阅读