3

C++ プロジェクトで、ファイル ( ) を開きたいfstream::open()(これは大きな問題のようです)。プログラムの Windows ビルドが失敗します。

  • ファイル「あ」 (UTF-8 0xC3 0xA4)

    std::string s = ...;
    //Convert s
    std::fstream f;
    f.open(s.c_str(), std::ios::binary | std::ios::in); //Works (f.is_open() == true)
    f.close();
    f.open(s.c_str(), std::ios::binary | std::ios::in | std::ios::out); //Doesn't work
    

    文字列sは UTF-8 でエンコードされていますが、UTF-8 から Latin1 (0xE4) に変換されます。私はQtを使用しているので、QString::fromUtf8(s.c_str()).toLocal8Bit().constData().

    ファイルを読み取り用に開くことができるのに、書き込み用に開けないのはなぜですか?

  • ファイル "и" (UTF-8 0xD0 0xB8)

    同じコード、まったく機能しません。

どうやら、この文字は Windows-1252 文字セットに収まらないようです。そのような fstream を開くにはどうすればよいですか (私は MSVC を使用していないので、できませんfstream::open(const wchar_t*, ios_base::openmode))。

4

2 に答える 2

4

STL の Microsoft 実装では、UTF-16 でエンコードされた文字列の Unicode サポートを可能にする非標準の拡張機能 (オーバーロード) があります。

UTF-16 でエンコードされた std::wstring を fstream::open() に渡すだけです。これが fstream で動作させる唯一の方法です。

Windows で Unicode をサポートする最も簡単な方法については、http: //utf8everywhere.org/で詳しく読むことができます。

于 2012-05-14T04:30:22.633 に答える
4

Windows で標準 API (std::fstream など) を使用すると、現在設定されている「ANSI コードページ」(CP_ACP) を使用してファイル名をエンコードできる場合にのみ、ファイルを開くことができます。

これは、Windows でこれらの API を使用して開くことができないファイルが存在する可能性があることを意味します。Microsoft が CP_ACP を CP_UTF8 に設定するためのサポートを実装しない限り、Microsoft の CRT または C++ 標準ライブラリの実装を使用してこれを行うことはできません。

(Windows には「短い」ファイル名と呼ばれる機能があり、有効にすると、ドライブ上のすべてのファイルに、標準 API 経由で使用できる ASCII ファイル名がありました。ただし、この機能は廃止されるため、実行可能なソリューションではありません。)

更新: Windows 10 は、コードページを UTF-8 に設定するためのサポートを追加しました

于 2012-05-13T04:09:40.397 に答える