不能將參數 1 從const char [*]轉換爲LPCWSTR

轉自: https://blog.csdn.net/whynottrythis/article/details/39839007

[2014/10/07 0:29]其解決方案就是, 將項目->屬性->配置屬性->常規->項目默認值下面的字符集換爲:使用多字節字符集

原因:

1.瞭解ANSI和Unicode編

1、ANSI(即MBCS):爲多字節字符集,它是不定長表示世界文字的編碼方式。ANSI表示英文字母時就和ASCII一樣,但表示其他文字時就需要用多字節。比如處理英文字符時使用單字節方式,在處理中文字符時使用雙字節方式。對於ANSI編碼方式,存在不同的字符集(Charset)。同樣的字節序列,在不同的字符集下表示的字符不一樣。要正確解析一個ANSI字符串,還要選擇正確的字符集,否則就可能導致所謂的亂碼現象。每個字符集都有一個唯一的編號,稱爲代碼頁(Code Page)。簡體中文(GB2312)的代碼頁爲936,而系統默認字符集的代碼頁爲0,它表示根據系統的語言設置來選擇一個合適的字符集。

2、Unicode:用兩個字節表示一個字符的編碼方式。比如字符'A'在ASCII下面用一個字節表示,而在Unicode下面用兩個字節表示,其中高字節用“0”填充。'程'在ASCII下面用兩個字節表示,而在Unicode下面也是用兩個字節表示。Unicode的用處就是定長表示世界文字,據統計,用兩個字節可以編碼現存的所有文字而沒有二義。

Unicode和ANSI的區別就相當於輸入法內的“全角”和“半角”的區別。由於不同 ANSI 編碼所規定的標準是不相同的(字符集不同),因此,對於一個給定的多字節字符串,我們必須知道它採用的是哪一種字符集則,才能夠知道它包含了哪些“字符”。而對於 UNICODE 字符串來說,不管在什麼環境下,它所代表的“字符”內容總是不變的。Unicode 有着統一的標準,它定義了世界上絕大多數的字符的編碼,使得拉丁文、數字、簡體中文、繁體中文、日文等都能以同一種編碼方式保存。
2.Windows下的兩種編碼

Windows下的序設計可以支持ANSI和Unicode兩種編碼方法的字符串,具體使用哪種就要看定義了MBCS宏還是Unicode宏。MBCS宏對應的字符串指針爲LPSTR(即char*),Unicode對應的指針爲LPWSTR(即unsigned char*)。爲了寫程序的方便,微軟定義了類型LPTSTR,在MBCS下它表示char*,在Unicode下它表示unsigned char*,這就可以重定義一個宏進行不同字符集的轉換了
    3.關係 

LPSTR:    指向一個字符串的32位指針,相當於char *;
LPCSTR:  指向一個常量字符串的32位指針,相當於const char *;
LPWSTR: 指向一個Unidoce字符串的32位指針,相當於wchar_t *;
LPCWSTR:指向一個常量Unicode字符串的32位指針,相當於const wchar_t*。

   4.宏_T和_L

常量字符串ANSI和Unicode的區分是由宏_T來決定的.
_T是一個適配宏。當定義了_UNICODE時,_T和L相同;否則,_T的字符串採用ANSI編碼方式。示例如下:

[cpp] view plaincopy

LPTSTR lptStr=new TCHAR[32];
TCHAR* szBuf=_T("Hello");

以上兩個語句,無論是在ANSI編碼方式,還是在Unicode編碼方式下都是正確的。
L表示字符串資源採用Unicode編碼方式,示例如下:

[cpp] view plaincopy

wchar_t Str[]=L"Hello World!"; //每個字符都用2個字節來存儲

如下是從MFC庫中拷來的:

[cpp] view plaincopy

#ifdef UNICODE
typedef LPWSTR LPTSTR;
typedef LPCWSTR LPCTSTR;
#else
typedef LPSTR LPTSTR;
typedef LPCSTR LPCTSTR;
#endif

   5.相互轉換方法

LPWSTR->LPTSTR:                          W2T(); 
LPTSTR->LPWSTR:                          T2W(); 
LPCWSTR->LPCSTR:                       W2CT(); 
LPCSTR->LPCWSTR:                       T2CW();
ANSI->UNICODE:                          A2W();
UNICODE->ANSI:                          W2A();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章