// C++11_wstring_string.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <locale>
#include <codecvt>
#include <iostream>
#include <string>
#include <windows.h>
std::wstring StringToWString(const std::string &str)
{
LPCSTR pszSrc = str.c_str();
int nLen = ::MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, NULL, 0);
if (nLen == 0)
return std::wstring(L"");
wchar_t* pwszDst = new wchar_t[nLen];
if (!pwszDst)
return std::wstring(L"");
::MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, pwszDst, nLen);
std::wstring wstr(pwszDst);
delete[] pwszDst;
pwszDst = NULL;
return wstr;
}
std::string WStringToString(const std::wstring &wstr)
{
LPCWSTR pwszSrc = wstr.c_str();
int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);
if (nLen == 0)
return std::string("");
char* pszDst = new char[nLen];
if (!pszDst)
return std::string("");
WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
std::string str(pszDst);
delete[] pszDst;
pszDst = NULL;
return str;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::string strTmp = "测试 C++11 宽字符转换。";
// wstring与utf-8及utf-16转换
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convertor_utf;
// wstring宽窄字符的转换
std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> conv(new std::codecvt<wchar_t, char, std::mbstate_t>("CHS"));
// C++11 std 方式转换
std::wstring wstrTmp1 = conv.from_bytes(strTmp);
// WindowsApi 方式转换
std::wstring wstrTmp2 = StringToWString(strTmp);
// 设置当地语言
std::wcout.imbue(std::locale("chs"));
// 输出wstring需要 wcout
std::wcout << "WSTRING: \t" << wstrTmp2 << wstrTmp1 << std::endl;
// wstring转换为string
std::string strTmp2 = conv.to_bytes(wstrTmp1);
std::cout << "C++11 wstring 转换为 string\t" << strTmp2 << std::endl;
std::string strTmp3 = WStringToString(wstrTmp2);
std::cout << "WindowsAPI wstring 转换为 string\t" << strTmp3 << std::endl;
system("pause");
return 0;
}
转UTF-8实例如下,要注意的是,工程中转了之后还要从wstring转换成string
// Unicode转为wstring类型 支持中文 2018/09/06_byWsl
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wide = converter.from_bytes(strHostName);
strncpy(pMsg->szHosts[nNum].szHostName, WStringToString(wide).c_str(), sizeof(pMsg->szHosts[nNum]) - 1);