1 std::string与std::wstring相互转换
1.1 windows上的std::string与std::wstring相互转换
在Windows上,可以使用MultiByteToWideChar和WideCharToMultiByte函数来进行std::string和std::wstring之间的转换,代码如下
std::wstring StringToWString(const std::string& str)
{
int wide_str_size = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
std::wstring wide_str(wide_str_size, 0);
MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, &wide_str[0], wide_str_size);
return wide_str;
}
std::string WStringToString(const std::wstring& wstr)
{
int narrow_str_size = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
std::string narrowStr2(narrow_str_size, 0);
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &narrowStr2[0], narrow_str_size, NULL, NULL);
return narrowStr2;
}
1.2 linux上的std::string与std::wstring相互转换
在Linux上,可以使用mbstowcs和wcstombs函数来进行std::string和std::wstring之间的转换,代码如下
#include <cstring>
std::wstring StringToWString(const std::string& str)
{
std::wstring wide_str;
wide_str.resize(mbstowcs(nullptr, str.c_str(), 0) + 1);
mbstowcs(&wide_str[0], str.c_str(), str.size());
return wide_str;
}
std::string WStringToString(const std::wstring& wstr)
{
std::string narrow_str;
narrow_str.resize(wcstombs(nullptr, wstr.c_str(), 0) + 1);
wcstombs(&narrow_str[0], wstr.c_str(), wstr.size());
return narrow_str;
}
1.3 使用示例
我们可以将上述在windows和linux上的实现进行整合,形成一个跨平台的std::string与std::wstring相互转换函数,代码如下
#include <iostream>
#include <string>
#if defined(WIN32) || defined(_WIN32) || defined(_WIN32_) || defined(WIN64) || defined(_WIN64) || defined(_WIN64_)
#include <Windows.h>
std::wstring StringToWString(const std::string& str)
{
int wide_str_size = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
std::wstring wide_str(wide_str_size, 0);
MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, &wide_str[0], wide_str_size);
return wide_str;
}
std::string WStringToString(const std::wstring& wstr)
{
int narrow_str_size = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
std::string narrowStr2(narrow_str_size, 0);
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &narrowStr2[0], narrow_str_size, NULL, NULL);
return narrowStr2;
}
#elif defined(__linux__)
#include <cstring>
std::wstring StringToWString(const std::string& str)
{
std::wstring wide_str;
wide_str.resize(mbstowcs(nullptr, str.c_str(), 0) + 1);
mbstowcs(&wide_str[0], str.c_str(), str.size());
return wide_str;
}
std::string WStringToString(const std::wstring& wstr)
{
std::string narrow_str;
narrow_str.resize(wcstombs(nullptr, wstr.c_str(), 0) + 1);
wcstombs(&narrow_str[0], wstr.c_str(), wstr.size());
return narrow_str;
}
#endif
int main() {
// std::string 转换为 std::wstring
std::string narrow_str = "Hello, world!";
std::wstring wide_str = StringToWString(narrow_str);
// std::wstring 转换为 std::string
std::wstring wide_str2 = L"Hello, 世界!";
std::string narrow_str2 = WStringToString(wide_str2);
// 输出结果
std::wcout << wide_str << std::endl;
std::cout << narrow_str2 << std::endl;
return 0;
}
1.4 使用std::codecvt_utf8进行std::string与std::wstring相互转换
我们也可以使用std::codecvt_utf8
进行std::string与std::wstring相互转换,代码如下
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
int main() {
// std::string 转换为 std::wstring
std::string narrowStr = "Hello, world!";
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::wstring wideStr = converter.from_bytes(narrowStr);
// std::wstring 转换为 std::string
std::wstring wideStr2 = L"Hello, 世界!";
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter2;
std::string narrowStr2 = converter2.to_bytes(wideStr2);
// 输出结果
std::wcout << wideStr << std::endl;
std::cout << narrowStr2 << std::endl;
return 0;
}
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ – std::string与std::wstring相互转换
原文链接:https://www.stubbornhuang.com/1589/
发布于:2021年08月20日 17:46:28
修改于:2024年03月07日 17:41:25
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
50