日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

C++標(biāo)準(zhǔn)庫(kù)之中文輸出詳細(xì)介紹

出處:highway 發(fā)布于:2009-07-07 12:00:09

  使用C++標(biāo)準(zhǔn)庫(kù)的iostream,可以方便地將控制臺(tái)、文件、字符串以及其它可擴(kuò)充的外部表示作為流來(lái)處理,但要處理中文,卻會(huì)碰到很多問題。本人原來(lái)沒怎么用過(guò)這個(gè)iostream,這幾天嘗試用這個(gè)寫點(diǎn)東西,一會(huì)兒不能輸出中文,一會(huì)兒不支持中文文件名的,搞得頭大。網(wǎng)上搜了搜,沒有發(fā)現(xiàn)適用于所有情況的解決方案。不過(guò)后來(lái)自己經(jīng)過(guò)多次測(cè)試,基本解決了這些問題,現(xiàn)在寫成文字作為一個(gè)總結(jié),也供碰到同樣問題的朋友參考。關(guān)于C語(yǔ)言中的 printf和wprintf的中文輸出,本文也進(jìn)行了探討。

  需要說(shuō)明的是,我的開發(fā)環(huán)境是VS 2005(標(biāo)準(zhǔn)庫(kù)當(dāng)然也是微軟實(shí)現(xiàn)的),不保證其它環(huán)境下是相同的效果。

  1、cout和wcout

  在缺省的C locale下,cout可以直接輸出中文,但對(duì)于wcout卻不行(至少VS 2005下不行)。對(duì)于wcout,需要將其locale設(shè)為本地語(yǔ)言才能輸出中文:

  wcout.imbue(locale(locale(),"",LC_CTYPE));  // ①

  也有人用如下語(yǔ)句的,但這會(huì)改變wcout的所有l(wèi)ocale設(shè)置,比如數(shù)字“1234”會(huì)輸出為“1,234”。

  wcout.imbue(locale(""));

  2、ofstream和wofstream

  在缺省的C locale下,ofstream能正確輸出中文到文件中,但不支持中文文件名;wofstream支持中文文件名,但不能向文件中輸出中文。要解決這個(gè)問題,需要在打開文件之前將全局locale設(shè)為本地語(yǔ)言。將全局locale設(shè)為本地語(yǔ)言后,ofstream和wofstream的問題都解決了,但 cout和wcout卻不能輸出中文了。要讓cout和wcout輸出中文,需要將全局locale恢復(fù)原來(lái)的設(shè)置,如下所示:

  locale &loc=locale::global(locale(locale(),"",LC_CTYPE));  // ②

  ofstream ofs("ofs測(cè)試.txt");

  wofstream wofs(L"wofs測(cè)試.txt");

  locale::global(loc);  // ③

  ofs<<"test測(cè)試"<<1234<<endl;

  wofs<<L"Another test還是測(cè)試"<<1234<<endl;

  3、printf和wprintf

  加上這兩位C語(yǔ)言中的老兄,問題更加復(fù)雜??紤]如下語(yǔ)句(注意s的大小寫):

  printf("%s", "multibyte中文\n");  // ④

  printf("%S", L"unicode中文\n");  // ⑤

  wprintf(L"%S", "multibyte中文\n");  // ⑥

  wprintf(L"%s", L"unicode中文\n");  // ⑦

  缺省情況下,⑤、⑦兩條語(yǔ)句不能輸出中文,這兩條語(yǔ)句中字符串的形式是unicode形式的。如果在所有輸出語(yǔ)句之前加上如下語(yǔ)句將C語(yǔ)言的全局locale設(shè)置為本地語(yǔ)言(C語(yǔ)言中只有全局locale)就可以正常輸出了:

  setlocale(LC_CTYPE, "");  // ⑧

  但這會(huì)導(dǎo)致cout和wcout不能輸出中文(汗,的確麻煩),將C語(yǔ)言的全局locale恢復(fù)后cout和wcout就正常了,如下所示:

  setlocale(LC_CTYPE, "C");  // ⑨

  但恢復(fù)后,printf和wprintf輸出Unicode文本又不正常了(輸出MultiByte文本總是正常的)。總不能每寫一個(gè) printf/wprintf就設(shè)置然后再恢復(fù)吧?所以,建議不要混用iostream和printf/wprintf,實(shí)在要混用,那就讓 printf/wprintf只輸出MultiByte字符串,這樣不需要調(diào)用setlocale(),也就不會(huì)影響到cout和wcout.

  總結(jié)

  總之,用iostream、printf/wprintf輸出中文,有點(diǎn)麻煩。概括起來(lái)要點(diǎn)如下:

  ·如果要用wcout,需要在使用之前按語(yǔ)句①將其locale設(shè)置為本地語(yǔ)言;

  ·如果要用ofstream或wofstream,要在打開文件之前按語(yǔ)句②將全局locale設(shè)為本地語(yǔ)言并保存初始的全局locale.然后在打開文件之后,按語(yǔ)句③將全局locale恢復(fù)為初始值;

  ·不要混用iostream和printf/wprintf.如果要混用,只用printf/wprintf輸出MultiByte字符串;

  ·單獨(dú)使用printf/wprintf時(shí),如果要輸出Unicode字符串,需要按語(yǔ)句⑧設(shè)置C語(yǔ)言的全局locale.如果只輸出MultiByte字符串,則不需設(shè)置。



  
關(guān)鍵詞:C++標(biāo)準(zhǔn)庫(kù)之中文輸出詳細(xì)介紹C++

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見,您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見一經(jīng)采納,將有感恩紅包奉上哦!