转换为 stdwstring

在 C++中,字符序列通过使用本机字符类型专门化 std::basic_string 类来表示。标准库定义的两个主要集合是 std::stringstd::wstring

  • std::string 采用 char 类型的元素构建

  • std::wstring 采用 wchar_t 类型的元素构建

要在两种类型之间进行转换,请使用 wstring_convert

#include <string>
#include <codecvt>
#include <locale>

std::string input_str = "this is a -string-, which is a sequence based on the -char- type.";
std::wstring input_wstr = L"this is a -wide- string, which is based on the -wchar_t- type.";

// conversion
std::wstring str_turned_to_wstr = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(input_str);

std::string wstr_turned_to_str = std::wstring_convert<std::codecvt_utf8<wchar_t>>().to_bytes(input_wstr);

为了提高可用性和/或可读性,你可以定义执行转换的函数:

#include <string>
#include <codecvt>
#include <locale>

using convert_t = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_t, wchar_t> strconverter;

std::string to_string(std::wstring wstr)
{
    return strconverter.to_bytes(wstr);
}

std::wstring to_wstring(std::string str)
{
    return strconverter.from_bytes(str);
}

样品用法:

std::wstring a_wide_string = to_wstring("Hello World!");

这肯定比 std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes("Hello World!") 更具可读性。

请注意,charwchar_t 并不意味着编码,并且没有给出大小的字节数。例如,wchar_t 通常实现为 2 字节数据类型,通常包含 Windows 下的 UTF-16 编码数据(或 Windows 2000 之前版本中的 UCS-2)和使用 UTF-32 编码的 4 字节数据类型 Linux 操作系统。这与较新的类型 char16_tchar32_t 形成对比,后者在 C++ 11 中引入并且保证足够大以分别保存任何 UTF16 或 UTF32字符(或更确切地说,代码点 )。