wchar_t 和 char 之間轉換


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中儲存了CStrwchar_t版本。

 

方法三:

外還可以通過流的方法來char*類型轉換為wchar_t*類型,但這樣的轉換得到的結果將是const類型,而類似的方法不能將wchar_t*類型轉換為char*類型。

constchar*  轉換為 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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM