Linux下string和wstring的转换
来源:互联网 发布:如何建立网络连接 编辑:程序博客网 时间:2024/04/30 08:51
string是单字节字符串,而wstring是宽字节字符串,当涉及到中文字符的时候往往需要在两者之间进行转换,今天自己偶然遇到这个问题,从网上搜罗了一通,稍微做个它们之间转换常用方法的总结吧。
一、string 转 wstring:
1.string source;
wstring target(source.begin() ,source.end());
这种转换对中文不支持,慎用。
2.调用MultiByteToWideChar():
//Converting a Ansi string to WChar stringstd::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;}
3.采用ATL封装_bstr_t的过渡(_bstr_t是C++对BSTR的封装,它的构造和析构函数分别调用SysAllocString和SysFreeString函数,其他操作是借用BSTR API函数。):
wstring s2ws(const string& s){ _bstr_t t = s.c_str(); wchar_t* pwchar = (wchar_t*)t; wstring result = pwchar; return result;}
4.采用CRT库的mbstowcs()函数,与平台无关,需设定locale:
wstring s2ws(const string& s){ setlocale(LC_ALL, "chs"); const char* _Source = s.c_str(); size_t _Dsize = s.size() + 1; wchar_t *_Dest = new wchar_t[_Dsize]; wmemset(_Dest, 0, _Dsize); mbstowcs(_Dest,_Source,_Dsize); wstring result = _Dest; delete []_Dest; setlocale(LC_ALL, "C"); return result;}
二、wstring 转 string的方法,与上面相似:
1.调用WideCharToMultiByte():
//Converting a WChar string to a Ansi stringstd::string WChar2Ansi(LPCWSTR pwszSrc){ int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL); if (nLen<= 0) return std::string(""); char* pszDst = new char[nLen]; if (NULL == pszDst) return std::string(""); WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL); pszDst[nLen -1] = 0; std::string strTemp(pszDst); delete [] pszDst; return strTemp;}
2.采用ATL封装_bstr_t的过渡:
string ws2s(const wstring& ws){ _bstr_t t = ws.c_str(); char* pchar = (char*)t; string result = pchar; return result;}
3.使用CRT库的wcstombs()函数:
string ws2s(const wstring& ws){ string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C"; setlocale(LC_ALL, "chs"); const wchar_t* _Source = ws.c_str(); size_t _Dsize = 2 * ws.size() + 1; char *_Dest = new char[_Dsize]; memset(_Dest,0,_Dsize); wcstombs(_Dest,_Source,_Dsize); string result = _Dest; delete []_Dest; setlocale(LC_ALL, curLocale.c_str()); return result;}
0 0
- Linux下string和wstring的转换
- wstring和string的相互转换
- string和wstring相互转换方法,标准C++做成,可以在Linux、Windows下运行
- string和wstring相互转换方法,标准C++做成,可以在Linux、Windows下运行
- string和wstring相互转换
- string和wstring相互转换
- string和wstring相互转换
- string和wstring相互转换
- string和wstring相互转换
- string和wstring相互转换
- string和wstring相互转换
- string和wstring相互转换
- string和wstring相互转换
- string和wstring相互转换
- wstring和string互相转换
- Unicode下wstring(wchar_t*)和string(char*)互相转换
- Unicode下wstring(wchar_t*)和string(char*)互相转换
- Unicode下wstring(wchar_t*)和string(char*)互相转换
- Response属性及方法
- hdu 1232 并查集
- bootstrap 中文文档
- 转:久邦数码张向东:GO桌面如何做到3亿全球用户
- COCOS2DX3.0的3种触摸响应机制
- Linux下string和wstring的转换
- 永记今日
- Edit Distance
- Ext3.2 布局——anchor layout
- Mac OS X:sudo 命令需要非空的管理员密码
- linux安装网卡驱动
- c++11
- php配置yii框架
- Linux下查看主机支持的内存