wstring MultCHarToWideChar(string str)
{
//獲取緩衝區的大小,並申請空間,緩衝區大小是按字符計算的
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';//添加字符串結尾
//刪除緩衝區並返回值
wstring return_value;
return_value.append(buffer);
delete []buffer;
return return_value;
}
string WideCharToMultiChar(wstring str)
{
string return_value;
//獲取緩衝區的大小,並申請空間,緩衝區大小是按字節計算的
int len=WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),NULL,0,NULL,NULL);
char *buffer=new char[len+1];
WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),buffer,len,NULL,NULL);
buffer[len]='/0';
//刪除緩衝區並返回值
return_value.append(buffer);
delete []buffer;
return return_value;
}
因而使用
string mstring = WideCharToMultiChar( (LPCTSTR)mCString );
strcpy_s( pach, sizeof(pach), mstring.c_str() );c++
void ConvertUnicodeToAscii(const CString &csFilestr, char* pszData)
{
int iFileLength = csFilestr.GetLength();
char * szBuff;
szBuff = new char[iFileLength*sizeof(TCHAR)+sizeof(TCHAR)];
#if !defined (_WIN32_WCE) && !defined(_UNICODE)
strcpy(szBuff,(LPCTSTR)csFilestr);
#else
iFileLength = WideCharToMultiByte(CP_OEMCP,
WC_COMPOSITECHECK,
csFilestr,
iFileLength,
szBuff,
iFileLength*sizeof(TCHAR)+sizeof(TCHAR),
NULL,NULL);
#endif
szBuff[iFileLength] = '/0';
strcpy(pszData, szBuff);
delete[] szBuff;
szBuff = NULL;
}
★在UNICODE下,一樣的CString str= "str"會報錯誤的!!!
應該是:CString str = L"str";
或者 CString str = _T("str");
★ANSI中CString 裏面的串類型至關於 char *
UNICODE裏面的卻至關於: WCHAR *
★UNICODE下的CString 事實上是CStringW
ANSI下的CString 事實上是CStringA,只不過使用宏CString隱藏了數組
CString 是一種很特殊的 C++ 對象,它裏面包含了三個值:一個指向某個數據緩衝區的指針、一個是該緩衝中有效的字符記數(它是不可存取的,是位於
CString 地址之下的一個隱藏區域)以及一個緩衝區長度。
有效字符數的大小能夠是從0到該緩衝最大長度值減1之間的任何數(由於字符串結尾有一個NULL字符)。字符記數和緩衝區長度被巧妙隱藏。app
CString ,BSTR ,LPCTSTR之間關係和區別ide
CString是一個動態TCHAR數組,BSTR是一種專有格式的字符串(須要用系統提供的函數來操縱,LPCTSTR只是一個常量的TCHAR指針。函數
CString 是一個徹底獨立的類,動態的TCHAR數組,封裝了 + 等操做符和字符串操做方法。
typedef OLECHAR FAR* BSTR;
typedef const char * LPCTSTR;編碼
vc++中各類字符串的表示法
首先char*
是指向ANSI字符數組的指針,其中每一個字符佔據8位(有效數據是除掉最高位的其餘7位),這裏保持了與傳統的C,C++的兼容。
LP的含義是長指針(long
pointer)。LPSTR是一個指向以‘/0’結尾的ANSI字符數組的指針,與char*能夠互換使用,在win32中較多地使用LPSTR。
而LPCSTR中增長的‘C’的含義是「CONSTANT」(常量),代表這種數據類型的實例不能被使用它的API函數改變,除此以外,它與LPSTR是等同的。
1.LP表示長指針,在win16下有長指針(LP)和短指針(P)的區別,而在win32下是沒有區別的,都是32位.因此這裏的LP和P是等價的.
2.C表示const
3.T是什麼東西呢,咱們知道TCHAR在採用Unicode方式編譯時是wchar_t,在普通時編譯成char.
爲了知足程序代碼國際化的須要,業界推出了Unicode標準,它提供了一種簡單和一致的表達字符串的方法,全部字符中的字節都是16位的值,其數量也能夠知足差很少世界上全部書面語言字符的編碼需求,開發程序時使用Unicode(類型爲wchar_t)是一種被鼓勵的作法。
LPWSTR與LPCWSTR由此產生,它們的含義相似於LPSTR與LPCSTR,只是字符數據是16位的wchar_t而不是char。
而後爲了實現兩種編碼的通用,提出了TCHAR的定義:
若是定義_UNICODE,聲明以下:
typedef wchar_t TCHAR;
若是沒有定義_UNICODE,則聲明以下:
typedef char TCHAR;
LPTSTR和LPCTSTR中的含義就是每一個字符是這樣的TCHAR。
CString類中的字符就是被聲明爲TCHAR類型的,它提供了一個封裝好的類供用戶方便地使用。
LPCTSTR:
#ifdef _UNICODE
typedef const wchar_t * LPCTSTR;
#else
typedef const char * LPCTSTR;
#endif
VC經常使用數據類型使用轉換詳解指針
單寬字節互換的程序,估計之後還用得着。
void MyWideCharToMultiByte(WCHAR* wchars,CHAR* schars,int scharsLen)
{
memset(schars,0,scharsLen);
CString m_snd = wchars;
int len = m_snd.GetLength();
CString tmpstr(m_snd); //複製要發送的字符串
int multibytelen=WideCharToMultiByte( //計算從Unicode轉換到Ansi後須要的字節數
CP_ACP, //根據ANSI code page轉換
WC_COMPOSITECHECK | WC_DEFAULTCHAR, //轉換出錯用缺省字符代替
(LPCWSTR)tmpstr.GetBuffer(len), //要轉換的字符串地址
len, //要轉換的個數
0, //轉換後字符串放置的地址
0, //最多轉換字符的個數,爲0表示返回轉換Unicode後須要多少個字節
0, //缺省的字符:"/0"
0 //缺省的設置
);
WideCharToMultiByte( //轉換Unicode到Ansi
CP_ACP,
WC_COMPOSITECHECK | WC_DEFAULTCHAR,
(LPCWSTR)tmpstr.GetBuffer(len),
len,
(char *)schars, //轉換到緩衝區中
scharsLen, //最多個字節
0,
0
);
}
//程序接收到的字符串最後保存到CString tmpstr中.
//接收函數片段
void MyMultiByteToWideChar(char* schars,CString &wstr)
{
// TODO: Add your specialized code here and/or call the base class
// char * p = "abcdefg我是誰hijk";
int widecharlen=MultiByteToWideChar( //計算從Ansi轉換到Unicode後須要的字節數
CP_ACP,
MB_COMPOSITE,
(char*)schars, //要轉換的Ansi字符串
-1, //自動計算長度
0,
0
);
CString tmpstr;
tmpstr.GetBuffer(widecharlen); //爲轉換後保存Unicode字符串分配內存
MultiByteToWideChar( //從Ansi轉換到Unicode字符
CP_ACP,
MB_COMPOSITE,
(char*)schars,
-1,
(LPWSTR)tmpstr.GetBuffer(widecharlen), //轉換到tmpstr
widecharlen //最多轉換widecharlen個Unicode字符
);
wstr = tmpstr;
}code
void TestFunction()
{
TCHAR abc[]=_T("ab咱們的家ab");
char b[15];
MyWideCharToMultiByte(abc,b,sizeof(b));
// char c[]="ab若是cd就行了!abcdefg";
CString str;
MyMultiByteToWideChar(b,str);對象
MyWideCharToMultiByte((LPWSTR)str.GetBuffer(0),b,sizeof(b));內存