vc++2005以后,Visual studio 編譯器默認的字符集為Unicode。VC中很多字符處理默認為寬字符wchar_t,如CString的getBuffer(),而一些具體操作函數的輸入卻仍要求是單字符的char,這邊需要對兩者進行轉換。查閱網上若干多資料,總結為一下幾種方法。
方法一:WideCharToMultiByte()和 MultiByteToWideChar()
1.1 wchar_t 轉為 char
使用函數 WideCharToMultiByte(),此函數把寬字符串轉換成指定的新的字符串,如ANSI 等,新字符串不必是多字節字符集。
wchar_t* pwszUnicode = L"Holle"; //wcslen(pwsUnicode)=5
int iSize; char* pszMultiByte;
//返回接受字符串所需緩沖區的大小,已經包含字符結尾符'\0' iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL); //iSize =wcslen(pwsUnicode)+1=6
pszMultiByte = (char*)malloc(iSize*sizeof(char)); //不需要 pszMultiByte = (char*)malloc(iSize*sizeof(char)+1);
WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);
1.2 char 轉為 wchar_t
使用函數 MultiByteToWideChar(),此函數把多字節字符串轉換成寬字符串(Unicode),待轉換的字符串並不一定是多字節的。
char* pszMultiByte = "Holle"; //strlen(pwsUnicode)=5
int iSize;
wchar_t* pwszUnicode ;
//返回接受字符串所需緩沖區的大小,已經包含字符結尾符'\0'
iSize = MultiByteToWideChar(CP_ACP, 0, pszMultiByte , -1, NULL, 0); //iSize =wcslen(pwsUnicode)+1=6
pwszUnicode = (wchar_t *)malloc(iSize*sizeof(wchar_t)); //不需要 pwszUnicode = (wchar_t *)malloc((iSize+1)*sizeof(wchar_t))
MultiByteToWideChar(CP_ACP, 0, pszMultiByte , -1, pwszUnicode , iSize);
參考:
http://www.cnblogs.com/wind-net/archive/2012/10/31/2718329.html
http://www.cnblogs.com/tclikang/archive/2012/06/11/2544771.html
http://blog.csdn.net/fengshalangzi/article/details/5815073
方法二: 用stdlib.h中的mbstowcs_s() 和 wcstombs_s()
2.1 wchar_t 轉為 char
用stdlib.h中的wcstombs_s函數,例子:
#include <stdlib.h>
wchar_t *WStr = L"string to convert"; size_t len = wcslen(WStr) + 1; size_t converted = 0; char *CStr; CStr=(char*)malloc(len*sizeof(char)); wcstombs_s(&converted, CStr, len, WStr, _TRUNCATE);
這時WStr中的內容將被轉化為char版本儲存在CStr中。
2.2 char*轉換為wchar_t*
用stdlib.h中的mbstowcs_s函數,例子:
#include <stdlib.h>
char *CStr = "string to convert"; size_t len = strlen(CStr) + 1; size_t converted = 0; wchar_t *WStr; WStr=(wchar_t*)malloc(len*sizeof(wchar_t)); mbstowcs_s(&converted, WStr, len, CStr, _TRUNCATE);
其結果是WStr中儲存了CStr的wchar_t版本。
方法三:
外還可以通過流的方法來char*類型轉換為wchar_t*類型,但這樣的轉換得到的結果將是const類型,而類似的方法不能將wchar_t*類型轉換為char*類型。
(const)char* 轉換為 const wchar_t*
需要用到 sstream 頭文件:
#include<sstream>
char *cstr="string to convert";
wstringstream wss;
wss<<cstr;
再調用wss.str().c_str(); 即可得到 const wchar_t* 類型的返回值。
雖然stringstream流不能將wchar_t*轉換成char*,但可以用來進行數值類型和字符串之間的轉換,例如:
double d=2734792.934f;
stringstream ss;
ss<<d;
調用ss.str()可得到string類型字符串 ”273479e+006”,又如:
string str("299792458");
stringstream ss;
long i=0;
ss<<str;
ss>>i;
此時i=299792458。
轉自:http://blog.163.com/tianshi_17th/blog/static/4856418920085209414977/