UniCode 下 CString 轉 char* 的方法的文章有很多,但是大部分都是在互相轉載,看了那麼多資料,仍然沒有解決亂碼的問題,後來從一個論壇的一條回複裡面找到了正確的方法,特此拿出來與大家分享。
先總結一下網上找到的三種轉換的方法:
方法一:使用函數setlocale
setlocale(LC_ALL,"chs");
需要包含標頭檔#include <locale.h>
此方法的思路是配置地區化資訊。通常在需要輸入輸出中文的時候設定一下,就沒問題了,setlocale詳情 點我
方法二:使用函數:T2A、W2A
CString str = _T("D://校內項目//QQ.bmp");
//宣告身份識別符
USES_CONVERSION;
//調用函數,T2A和W2A均支援ATL和MFC中的字元轉換
char *
pFileName = T2A(str);
//char * pFileName =
W2A(str); //也可實現轉換
注意:有時候可能還需要添加引用#include <afxpriv.h>
使用此方法要注意宣告身份識別符,T2A、W2A詳情 點我
方法三:使用API:WideCharToMultiByte進行轉換
CString str = _T("D://校內項目//QQ.bmp");
//注意:以下n和len的值大小不同,n是按字元計算的,len是按位元組計算的
int n =
str.GetLength(); // n = 14, len = 18
//擷取寬位元組字元的大小,大小是按位元組計算的
int len
= WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);
//為多位元組字元數組申請空間,數組大小為按位元組計算的寬位元組位元組大小
char *
pFileName = new char[len+1]; //以位元組為單位
//寬位元組編碼轉換成多位元組編碼
WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,str,str.GetLength() + 1 ,pFileName,len + 1
,NULL,NULL);
pFileName[len+1] = '/0';
//多位元組字元以'/0'結束
//多謝樓下的提醒,特此修改一下
pFileName[len] = '\0'; //多位元組字元以'\0'結束
這三種方法都是感覺比較靠譜的,也有很多人驗證了可以成功,但是在我用的時候很悲催,三種方法都不行,經過仔細的考慮,發現第三種方法應該是萬無一失,最保險的方法啊,後來經過仔細尋找,原來是參數出了問題,黃色被我劃掉的是網上流傳的比較廣泛的方法,WideCharToMultiByte(CP_ACP,0,str,str.GetLength() + 1 ,pFileName,len + 1 ,NULL,NULL);是我驗證成功的寫法,至於為什麼是這樣,留給大家自己思考。WideCharToMultiByte詳情 點我
小弟才疏學淺,寫的不對,敬請指正!