CStdioFile UNICODE編譯 讀取中文漢字亂碼 .

函數原形爲:char *setlocale( int category, const char *locale );
頭文件:<locale.h>
所支持的操做系統爲:ANSI, Win 95, Win NT
對於簡體中文可使用以下設置:setlocale( LC_ALL, "chs" ); 
爲何必定要調用setlocale呢?
由於在C/C++語言標準中定義了其運行時的字符集環境爲"C",也就是ASCII字符集的一個子集,那麼mbstowcs在工做時會將cstr中所包含的字符串看做是ASCII編碼的字符,而不認爲是一個包含有chs編碼的字符串,因此他會將每個中文拆成2個ASCII編碼進行轉換,這樣獲得的結果就是會造成4個wchar_t的字符組成的串,那麼如何纔可以讓mbstowcs正常工做呢?在調用mbstowcs進行轉換之間必須明確的告訴mbstowcs目前cstr串中包含的是chs編碼的字符串,經過setlocale( LC_ALL, "chs" )函數調用來完成,須要注意的是這個函數會改變整個應用程序的字符集編碼方式,必需要經過從新調用setlocale( LC_ALL, "C" )函數來還原,這樣就能夠保證mbstowcs在轉換時將cstr中的串看做是中文串,而且轉換成爲2個wchar_t字符,而不是4個。函數

本地化設置須要具有三個條件:
a. 語言代碼 (Language Code)
b. 國家代碼 (Country Code) 
c. 編碼(Encoding)
本地名字能夠用下面這些部分來構造:
語言代碼_國家代碼.編碼 好比(zh_CN.UTF-8, en_US等)編碼

CStdioFile file 
//設置語言爲中文,不然在Unicode編碼下讀出中文字符爲亂碼 
char* old_locale=_strdup( setlocale(LC_CTYPE,NULL) ); 
setlocale( LC_CTYPE,"chs"); 
file.Open( strOutputFile,CStdioFile::modeRead); 
file.Read(); 
file.Close(); 
setlocale( LC_CTYPE, old_locale ); //還原語言區域的設置 
free( old_locale );//還原區域設定操作系統

 

用下面的也行code

CStdioFile   file1; 
file1.Open(_T( "f:\\jun\\kj66\\dev.txt "),CFile::modeRead); 
CString   strTem(_T( " ")); 
file1.ReadString(strTem); 
file1.ReadString(strTem); 
int   n   =   strTem.GetLength(); 
TCHAR*   p   =   strTem.GetBuffer(); 
char*   pp   =   new   char[n+1]; 
int   j   =   0; 
while(n) 

*(pp+j)   =   (char)   *(p+j); 
n--; 
j++; 

*(pp+j)   =   '\0 '; 
strTem   =   pp; 
MessageBoxW(strTem); 
file1.Close(); 字符串

相關文章
相關標籤/搜索