经常会遇到字符集的转化,char到wchar_t,string与wstring相互转化。而且还要考虑到跨平台。
#include<string>
using namespace std;
//将string转换成wstring
wstring string2wstring(string str)
{
wstring result;
//获取缓冲区大小,并申请空间,缓冲区大小按字符计算
int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);
TCHAR* buffer = new TCHAR[len + 1];
//多字节编码转换成宽字节编码
MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);
buffer[len] = '\0'; //添加字符串结尾
//删除缓冲区并返回值
result.append(buffer);
delete[] buffer;
return result;
}
//将wstring转换成string
string wstring2string(wstring wstr)
{
string result;
//获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的
int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);
char* buffer = new char[len + 1];
//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);
buffer[len] = '\0';
//删除缓冲区并返回值
result.append(buffer);
delete[] buffer;
return result;
}
参考:字符串转换Unicode下wstring(wchar_t*)和string(char*)互相转换
一、string 转 wstring:
1.
string source;
wstring target(source.begin() ,source.end());
这种转换对中文不支持,慎用。
2.调用MultiByteToWideChar():
//Converting a Ansi string to WChar string
std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)
{
int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);
if(nSize <= 0) return NULL;
WCHAR *pwszDst = new WCHAR[nSize+1];
if( NULL == pwszDst) return NULL;
MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pszSrc, nLen, pwszDst, nSize);
pwszDst[nSize] = 0;
if( pwszDst[0] == 0xFEFF) // skip Oxfeff
for(int i = 0; i < nSize; i ++)
pwszDst[i] = pwszDst[i+1];
wstring wcharString(pwszDst);
delete pwszDst;
return wcharString;
}
1.源码实现
#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <wchar.h>
#include <locale.h>
using namespace std;
int ws2s(const wstring &ws, string &r)
{
const wchar_t *source = ws.c_str();
char *dest = NULL;
int len = 0;
int ret = 0;
len = wcslen(source) + 1;
if(len <= 1)
return 0;
dest = new char[len*sizeof(wchar_t)];
ret = wcstombs(dest, source, len*sizeof(wchar_t));
r = string(dest);
delete[] dest;
return ret;
}
int s2ws(const string &s, wstring &r)
{
const char *source = s.c_str();
wchar_t *dest = NULL;
int len = 0;
int ret = 0;
len = strlen(source) + 1;
if(len <= 1)
return 0;
dest = new wchar_t[len];
ret = mbstowcs(dest, source, len);
r = wstring(dest);
delete[] dest;
return ret;
}
int main()
{
string a("你好,世界");
wstring b;
string c;
setlocale(LC_CTYPE, "zh_CN.utf8");
s2ws(a, b);
ws2s(b, c);
cout << c << endl;
return 0;
}
2.编译源码
$ g++ -o example example.cpp
3.运行及其结果
$ ./example
你好,世界