15

VS2008 を使用して次のプログラムを作成しました。

#include <fstream>
int main()
{
    std::wofstream fout("myfile");
    fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl;
}

コンパイルしようとすると、ソース ファイルを Unicode で保存するかどうかを IDE が尋ねてきたので、「はい、どうぞ」と答えました。
次に、プログラムを実行すると、プロジェクトのフォルダーに myfile が表示されました。メモ帳で開いたところ、ファイルが空でした。メモ帳は ASCII データのみをサポートしていたことを思い出しました。ワードパッドで開きましたが、まだ空でした。最後に、私の中の小さな天才がファイル サイズを確認するように促しました。驚くことではありませんが、ファイル サイズは 0 バイトでした。そのため、プログラムを再構築して再実行しましたが、効果はありませんでした。最後に、私が欠けているものについて、StackOverflow の非常に知的な人々に尋ねることにしました。ここにいます :)

編集:

上記の知的な人々がコメントを残した後、私は彼らのアドバイスに従い、プログラムを次のように書き直すことにしました。

#include <fstream>
#include <iostream>
int main()
{
    std::wofstream fout("myfile");
    if(!fout.is_open())
    {
        std::cout << "Before: Not open...\n";
    }
    fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl;
    if(!fout.good())
    {
        std::cout << "After: Not good...\n";
    }
}

それを構築しました。実行しました。そして...コンソールには、驚いたことに、「後:良くない...」とはっきりと表示されました。そこで、投稿を編集して新しい情報を提供し、その理由と私に何ができるかを説明する回答を待ち始めました. :)

4

3 に答える 3

12

MSVC は、codecvt_utf8この問題に対するロケール ファセットを提供します。

#include <codecvt>

// ...  
std::wofstream fout(fileName);
std::locale loc(std::locale::classic(), new std::codecvt_utf8<wchar_t>);
fout.imbue(loc);
于 2010-10-16T21:18:55.240 に答える
8

Visual Studio では、出力ストリームは常に ANSI エンコーディングで記​​述され、UTF-8 出力はサポートされていません。

基本的に行う必要があるのは、ロケール クラスを作成し、そこに UTF-8 ファセットをインストールしてから、それを fstream に吹き込むことです。

コード ポイントが UTF エンコーディングに変換されていないとどうなりますか。したがって、MSVC は UTF-8 をサポートしていないため、基本的にこれは機能しません。

これは、UTF-8 ロケールの Linux で機能します。

#include <fstream>
int main()
{
    std::locale::global(std::locale(""));
    std::wofstream fout("myfile");
    fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl;
}

〜そして、窓の下ではこれはうまくいくでしょう:

#include <fstream>
int main()
{
    std::locale::global(std::locale("Russian_Russia"));
    std::wofstream fout("myfile");
    fout << L"Россия" << std::endl;
}

MSVC では ANSI エンコーディングのみがサポートされているためです。

Codecvt ファセットは、一部の Boost ライブラリに含まれています。例: http://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/codecvt.html

于 2010-10-16T21:06:12.913 に答える
0

次のコードが正常に動作することがわかりました。私はVS2019を使用しています。

#include <iostream>
#include <fstream>
#include <codecvt>

int main()
{
    std::wstring str = L"abàdëef€hhhhhhhµa";
    std::wofstream fout(L"C:\\app.log.txt", ios_base::app); //change this to ios_base::in or ios_base::out as per relevance
    std::locale loc(std::locale::classic(), new std::codecvt_utf8<wchar_t>);
    fout.imbue(loc);
    fout << str;
    fout.close();
}
于 2021-11-10T05:23:19.507 に答える