關於char[]轉換成LPCWSTR的有關問題

1、問題的緣由:VS2010默認採用寬字符UNICODE編碼方式,定義了Unicode,所以相關的字符串必須爲unicode字符串,而非ascii字符串。

LPCWSTR中的W是寬字符的意思,是UNICODE,就是說不是傳統的char這種單字節字符,而是一個字符佔兩字節.
編譯器把LoadImage解釋成了LoadImageW,說明代碼中某個地方定義了UNICODE開關,編譯環境成了寬字節的,要把這個定義去掉. html

Win32 API也分2中版本, MessageBoxA / MessageBoxW,,,MessageBox根據是否認義_UNICODE宏而定義到其中一個版本。 windows

 
     2、正確的解決方案是
選擇【項目菜單】->【最後的屬性】->【配置屬性】->【常規】->【項目默認值】->unicode改成未設置。 數組


     3、幾個注意事項(此處引用了一個臺灣開發論壇的幾句話): ide

1,若定義UNICODE,相關字串必須使用Unicode的字串而非ANSI字串也就是wchar_t * wfilename;

(2)指定的Unicode字串常數請加L「...」;例如wchar_t *
wfilename = L 「HelloWorld 」;

3.ansi字串就是傳統的char*)wchar_t的*unicode的的字符串互轉請用MultiByteToWideCharWideCharToMultiByte這兩個API函數。

4,若是不太unicode的,那麼不要UNICODE定義,用傳統的方式處理。


     4、那麼如何將char*或者char數組轉換成VS2005中的LPCWSTR呢? 函數

(1)先看擊中錯誤的方法: 編碼

       char buffer[80];
錯誤方法一:
         wsprintf(buffer,L"WM_CHAR: Character = %c   ",ascii_code);
         TextOut(hdc, 0,0,(LPCWSTR)buffer, strlen(buffer));
這個只能顯示第一個字母「W」
錯誤方法二:
         sprintf((LPCWSTR)buffer,L"Key State = 0X%X  ",key_state);
         TextOut(hdc, 0,16,(LPCWSTR)buffer, strlen(buffer));
這個出現的是亂碼!
錯誤方法三:       
         sprintf(buffer,L"Key State = 0X%X  ",key_state);
         TextOut(hdc, 0,16,buffer, strlen(buffer));
這個提示不能將char[80]轉換成LPCWSTR spa

強制類型轉換是不行的,由於一個是字符佔一個字節,一個事佔兩個字節,可是sprintf等函數是不知道的。 .net


(2)正確轉換方法: code

方法一:使用MultiByteToWideChar和 MultiByteToWideChar函數,你們能夠參考CSDN論壇的這篇帖子http://topic.csdn.net/u/20080229/14/eb027e95-8e4e-4afe-abf3-b85d90427355.html?seed=824864853&r=60494553#r_60494553 htm

代碼以下: #include <windows.h> #include <atlstr.h> #define STRSAFE_NO_DEPRECATE #include <strsafe.h>            // for String... functions #include <crtdbg.h>                // for _ASSERTE     CStringW ConvertW(CString str, int sourceCodepage)     {         //int len=str.GetLength();         int unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0) + 1;         wchar_t* pUnicode;         pUnicode=new wchar_t[unicodeLen];         memset(pUnicode,0,(unicodeLen)*sizeof(wchar_t));         MultiByteToWideChar(sourceCodepage, CP_ACP, str, -1, (LPWSTR)pUnicode, unicodeLen);         CStringW rt = pUnicode;         //delete pUnicode;         SAFE_DELETEGROUP( pUnicode );         return rt;     } 調用:        CStringW wszTemp = ConvertW( Filename, CP_ACP);         LPWSTR pwStr = wszTemp.GetBuffer(); 

相關文章
相關標籤/搜索