使用c++標準庫的iostream,可以方便地將控制台、檔案、字串以及其它可擴充的外部表示作為流來處理,但要處理中文,卻會碰到很多問題。本人原來沒怎麼用過這個iostream,這幾天嘗試用這個寫點東西,一會兒不能輸出中文,一會兒不支援中文檔名的,搞得頭大。網上搜了搜,沒有發現適用於所有情況的解決方案。不過後來自己經過多次測試,基本解決了這些問題,現在寫成文字作為乙個總結,也供碰到同樣問題的朋友參考。關於c語言中的printf和wprintf的中文輸出,本文也進行了**。
需要說明的是,我的開發環境是vs2005(標準庫當然也是微軟實現的),不保證其它環境下是相同的效果。
1、cout和wcout
在預設的clocale下,cout可以直接輸出中文,但對於wcout卻不行。對於wcout,需要將其locale設為本地語言才能輸出中文:
wcout.imbue(locale(locale(),"",lc_ctype));//①
也有人用如下語句的,但這會改變wcout的所有locale設定,比如數字「1234」會輸出為「1,234」。
wcout.imbue(locale(""));
2、ofstream和wofstream
在預設的clocale下,ofstream能正確輸出中文到檔案中,但不支援中文檔名;wofstream支援中文檔名,但不能向檔案中輸出中文。要解決這個問題,需要在開啟檔案之前將全域性locale設為本地語言。將全域性locale設為本地語言後,ofstream和wofstream的問題都解決了,但cout和wcout卻不能輸出中文了。要讓cout和wcout輸出中文,需要將全域性locale恢復原來的設定,如下所示:
locale&loc=locale::global(locale(locale(),"",lc_ctype));//②
ofstreamofs("ofs測試.txt");
wofstreamwofs(l"wofs測試.txt");
locale::global(loc);//③
ofs<<"test測試"<<1234《最後再加上**者(本站站長)的一點話:
乙個程式,一般不會用兩種字串,要麼用多位元組字串,要麼用寬字串.這樣,問題其實就很簡單,沒作者說得那麼複雜..就算有時候需要轉換,也有專門的函式(
例如,多位元組字元版本的程式,使用com元件,com元件需要寬字串.則可以利用_bstr_t,cstring)..
多位元組字元與寬字元
多位元組字符集 每個字元的編碼寬度不一,可為乙個位元組或多個位元組。1 ascii字元只佔乙個位元組 2 對於中文 日文等用兩個位元組 3 乙個字串中,如何區分哪個是中文字元,那個是ascii字元呢?windows程式設計 16進製制 10進製 的編碼wi ndow s程式設 計6e6fb3 cc ...
寬字元和多位元組字元(mbtowc wctomb)
c 語言原本是在英文環境中設計的,主要的字符集是7 位的ascii 碼。從此開始,8 位的byte 位元組 變成最常見的字元編碼單位,但是國際化軟體必須能夠表示不同的字元,而這些字元數量龐大,無法使用乙個位元組編碼,於是世界上使用各式 各樣多位元組的字元編碼集合已經有數十年了,比如用來表示 非拉丁字...
多位元組 與 寬字元 之間的轉換
檢視文章 寬字元轉多位元組,多位元組轉寬字元 2007 04 21 21 32 多位元組轉寬字元 cstring strtext 字串 int nsize int ncharsize multibytetowidechar cp acp,mb precomposed,strtext,nsize,nu...