1

これは私にとって難しいことのように思えます。CStringをテキストファイルに出力するこのコードがありますが、値はたまたまUnicode(日本語)です。この行がヒットするとすぐに、その下にあるものは何も印刷されません。

テキストファイルに日本語のテキストを印刷するにはどうすればよいですか?

#define OFSTREAM std::wofstream

OFSTREAM *outfile;
outfile = new OFSTREAM;
outfile->open (filename, ios::out);

CString varName = _T(" ");
/*stuff*/
*outfile << _T("  Name: ") << (LPCTSTR)varName << _T("\n");
4

3 に答える 3

2

ストリームが動作を停止する理由は、フェイル ビットが設定されるためです。エラーを処理していないため、ストリームが機能しなくなります。エラーが発生した場合、フェイル ビットをクリアする必要があります。

codecvt ファセットが日本語のワイド文字をバイトに変換する処理を行うように、wostream オブジェクトのロケールを設定する必要があります。デフォルトでは、VS で ASCII 文字のみをサポートする "C" ロケールが使用されます。日本語版の Windows で動作するようにファイルを作成するだけでよい場合は、次のようにします。

std::wofstream outfile(filename, ios::out);
outfile.imbue(std::locale("")); // use the system locale

CString varName = _T(" ");
/*stuff*/
outfile << L"  Name: " << (LPCTSTR)varName << L"\n";

または、Windows で日本語ロケールを指定することもできます。

outfile.imbue(std::locale("Japanese")); // use the japanese locale on any Windows system

これらの方法はどちらも従来の日本語ロケール エンコーディングを使用しますが、これはおそらく避けるべきです。代わりに UTF-8 を使用できます。

// replace just the codecvt facet of the stream's current locale
outfile.imbue(std::locale(outfile.getloc(), new std::codecvt_utf8_utf16<wchar_t>()));
于 2012-08-31T14:16:46.680 に答える
1

Unicodeとは、この場合、おそらくUTF16を意味します。ファイルの表示に使用するエディターによっては、ファイルの先頭にバイト順マーク(BOM)を付ける必要がある場合があります。これにより、エンコードとバイト順序が正しく推測されます。それ以外の場合は、ファイルを表示するときにエンコードを明示的に設定する必要があります。

ただし、あなたの質問は、ファイル内の日本語のテキストの前にテキストがあることを示唆しています。それを非ワイドストリングとして出すと、それが問題になります。混ぜないでください。すべてのテキストが広い場合は、選択したエディターで日本語の文字を表示する可能性がないか、Windowsでアジア言語のサポートをインストールしなかった可能性があります。

Firefoxは通常、エキゾチックなキャラクターをかなりうまくサポートしています。そこにファイルをドラッグし、エンコーディングを確認して、何が得られるかを確認します。

于 2012-08-31T01:56:24.103 に答える
0

Visual Studio を使用している場合は、C++ プロジェクト設定に移動し、ANSI ではなく Unicode を使用するように言語オプションを設定します。その後、Visual Studio はマクロ UNICODE と _UNICODE を自動的に定義します。これらを自分で定義する必要はありません。最初の非 ASCII 文字の後のすべてを失うのではなく、VC++ ライブラリがメモリ内の Unicode 文字列をテキスト ファイル内のマルチバイト ANSI 文字列に変換するように、おそらく setlocale を呼び出す必要があります。

MFC で他のコンパイラを使用している場合は、マクロ UNICODE と _UNICODE の両方を自分で定義する必要があると思いますが、他に何をしなければならないかわかりません。

テキスト ファイルにマルチバイト ANSI ではなく Unicode を含める場合、VC++ ライブラリでテキスト ファイルを変換する必要はありませんが、代わりに別のことを行う必要があります。MSDN ページwofstreamのコミュニティ コンテンツ セクションをご覧ください。

于 2012-08-31T02:44:32.323 に答える