C++_wcout/C_wprintf(wcout出力中国語)

3521 ワード

int _tmain(int argc,_TCHAR*argv[]){wcout.imbue(std::locale("chs"));wstring s=(L"愛してる");wcout< 
iostream、printf/wprintf、中国語出力はC++標準ライブラリのiostreamを使用し、コンソール、ファイル、文字列、その他の拡張可能な外部表示をストリームとして簡単に処理できますが、中国語を処理するには多くの問題があります.私はもともとこのiostreamをあまり使ったことがなくて、ここ数日これで何かを書いてみて、しばらく中国語を出力することができなくて、しばらく中国語のファイル名を支持しないで、頭が大きくなりました.ネットで検索したが、すべての状況に適用される解決策は見つからなかった.しかし、その後、自分で何度もテストをして、基本的にこれらの問題を解決して、今文字を書いて総括として、同じ問題に出会った友达の参考にします.C言語におけるprintfとwprintfの中国語出力についても検討した.
説明しなければならないのは、私の開発環境はVS 2005(標準ライブラリももちろんマイクロソフトが実現した)であり、他の環境で同じ効果が保証されていないことです.
1、coutとwcout
1、coutはcharを出力するためのものであり、coutでwcharを出力するとアドレスのみが出力され、wcoutでwcharを出力する.
2、wcoutのデフォルトは中国語を出力しないので、中国語を出力するにはsetlocale(LC_ALL、「chs」)を入れます.この行のコード.
完全なテストコード:
// C++
#include <iostream>
#include <locale>
using namespace std;
int main( void )
{
locale loc( "chs" );
//locale loc( "Chinese-simplified" );
//locale loc( "ZHI" );
//locale loc( ".936" );
wcout.imbue( loc );
std::wcout << L"  " << endl;

return 0;
}

デフォルトのC localeではcoutは直接中国語を出力できますが、wcoutではできません(少なくともVS 2005ではできません).wcoutの場合、中国語を出力するにはlocaleをローカル言語に設定する必要があります.
  wcout.imbue(locale(locale(),"",LC_CTYPE));//①
次の文を使用する人もいますが、wcoutのすべてのlocale設定が変更されます.たとえば、数字「1234」が「1234」に出力されます.
  wcout.imbue(locale(""));
2、ofstreamとwofstream
デフォルトのC localeでは、ofstreamは中国語をファイルに正しく出力できますが、中国語ファイル名はサポートされていません.wofstreamは中国語ファイル名をサポートしていますが、ファイルに中国語を出力することはできません.この問題を解決するには、ファイルを開く前にグローバルlocaleをローカル言語に設定する必要があります.グローバルlocaleをローカル言語に設定すると、ofstreamとwofstreamの問題は解決しましたが、coutとwcoutは中国語を出力できません.coutとwcoutを中国語で出力するには、次のようにグローバルlocaleを元の設定に戻す必要があります.
  locale &loc=locale::global(locale(locale(),"",LC_CTYPE));//②ofstream ofs(「ofsテスト.txt」);wofstream wofs(「wofsテスト.txt」)  locale::global(loc);//③ofs<「testテスト」<<1234<3、printfとwprintf
この二人のC言語のお兄さんを加えると、問題はもっと複雑です.次の文を考慮します(sの大文字と小文字に注意).
printf("%s","multibyte中国語/n");//④printf("%S",L"unicode中国語/n");//⑤wprintf(L"%S","multibyte中国語/n");⑥wprintf(L"%s",L"unicode中国語/n");⑦
デフォルトでは、⑤、⑦の2つの文は中国語を出力できません.この2つの文の文字列の形式はunicode形式です.すべての出力文の前に次の文を加えてC言語のグローバルlocaleをローカル言語(C言語ではグローバルlocaleのみ)に設定すると、正常に出力されます.
  setlocale(LC_CTYPE, "");//⑧
しかし、これはcoutとwcoutが中国語を出力できない(汗、確かに面倒)ことを招き、C言語のグローバルlocaleを回復するとcoutとwcoutは正常になります.以下のようにします.
  setlocale(LC_CTYPE, "C");//⑨
しかし、復元後、printfとwprintfがUnicodeテキストを出力するのは正常ではありません(MultiByteテキストを出力するのは常に正常です).printf/wprintfを1つ書くたびに設定して復元することはできませんよね?したがって、iostreamとprintf/wprintfを混用しないことをお勧めします.本当に混用するには、printf/wprintfにMultiByte文字列だけを出力させ、setlocale()を呼び出す必要がなく、coutとwcoutにも影響しません.
 
まとめ
要するに、iostream、printf/wprintfで中国語を出力するのは、ちょっと面倒です.要約すると、要点は以下の通りです.
wcoutを使用する場合は、使用する前に文1でlocaleをローカル言語に設定する必要があります.ofstreamまたはwofstreamを使用する場合は、ファイルを開く前に文②でグローバルlocaleをローカル言語に設定し、初期のグローバルlocaleを保存します.その後、ファイルを開いた後、文③でグローバルlocaleを初期値に復元します.iostreamとprintf/wprintfを混用しないでください.混用する場合はprintf/wprintfのみでMultiByte文字列を出力します.printf/wprintfを単独で使用する場合、Unicode文字列を出力する場合は、文⑧でC言語のグローバルlocaleを設定する必要があります.MultiByte文字列のみを出力する場合は、設定する必要はありません.
本文はCSDNブログから来て、転載して出典を明記してください:http://blog.csdn.net/wzcprince/archive/2009/07/11/4340699.aspx