C++ 转换为std :: wstring

示例

在C ++中,字符序列通过std::basic_string使用本机字符类型专门化类来表示。标准库定义的两个主要集合是std::string和std::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.";

// 转换
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("你好,世界!");

肯定比更具可读性std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes("你好,世界!")。


请注意,char并且wchar_t不表示编码,并且不提供以字节为单位的大小指示。例如,wchar_t通常实现为2字节的数据类型,通常在Windows下包含UTF-16编码的数据(在Windows 2000之前的版本中为UCS-2),在Linux下通常使用UTF-32编码为4字节的数据类型。 。这与C ++ 11中引入的较新的类型char16_t和形成对比char32_t,它们被确保足够大以分别容纳任何UTF16或UTF32“字符”(或更准确地说,是代码点)。