📅  最后修改于: 2023-12-03 15:25:02.965000             🧑  作者: Mango
在 C++ 中,我们可以使用 std::wstring
类型来表示宽字符串。它的定义如下:
typedef basic_string<wchar_t> wstring;
与 std::string
类型一样,std::wstring
也有一些成员函数可以方便地执行字符串操作。如果你需要将普通的字符串(即 const char*
)转换成 std::wstring
,可以使用下面的方法。
C++11 引入了 std::wstring_convert
类,可以用于字符串转换。这个类需要使用一个 std::locale
对象来指定转换所用的编码,常见的编码有 "utf-8"
和 "gbk"
。
下面的代码演示了如何将普通字符串转换成 std::wstring
:
#include <string>
#include <codecvt>
std::wstring s2ws(const std::string& str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> convert;
return convert.from_bytes(str);
}
int main()
{
std::string str = "Hello, world!";
std::wstring wstr = s2ws(str);
}
如果你需要使用更低层次的函数来进行字符串转换,可以使用 Windows API 中的 MultiByteToWideChar
函数。
#include <Windows.h>
#include <string>
std::wstring s2ws(const std::string& str)
{
int length = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, nullptr, 0);
wchar_t* buffer = new wchar_t[length];
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, buffer, length);
std::wstring result(buffer);
delete[] buffer;
return result;
}
int main()
{
std::string str = "Hello, world!";
std::wstring wstr = s2ws(str);
}
如果你需要在程序中频繁地进行字符串转换,可以使用 std::wstringstream
类。这个类可以将多个字符串插入到一个流中,然后通过流生成 std::wstring
。
下面的代码演示了如何使用 std::wstringstream
进行字符串转换:
#include <string>
#include <sstream>
std::wstring s2ws(const std::string& str)
{
std::wstringstream stream;
stream << std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(str);
return stream.str();
}
int main()
{
std::string str = "Hello, world!";
std::wstring wstr = s2ws(str);
}
在以上三种方法中,使用 std::wstring_convert
是推荐的方法,因为它是最简单也是最通用的方法。如果你的程序只在 Windows 平台上运行,可以使用 MultiByteToWideChar
;如果你需要高效地进行字符串转换,可以使用 std::wstringstream
。