解決UNICODE字符集下CStdioFile的Writestring無法寫入中文的問題

以下代碼文件以CStdioFile向無法向文本中寫入中文(用notepad.exe查看不到寫入的中文)

CStdioFile file;

file.Open(…);

file.WriteString(_T("abc你好"));//只能寫入abc

解決辦法:

使用setlocale語句設定區域


#include <locale>//頭文件
CStdioFile file;

file.Open(…);

char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );

setlocale( LC_CTYPE, "chs" );//設定

file.WriteString(_T("abc你好"));//正常寫入

setlocale( LC_CTYPE, old_locale );

free( old_locale );//還原區域設定

簡化處理可以僅使用語句setlocale( LC_CTYPE, "chs" )。

setlocale:
函數原形爲: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等)


轉自:http://apps.hi.baidu.com/share/detail/1125432

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章