私はboost filestreamsで問題に遭遇しました。私はWindowsの下のユーザーディレクトリにファイルを作成して変更する必要があります。しかし、ユーザ名にはウムラウトが含まれているため、MinGWでコンパイルすると失敗します。標準では、boostest useのfilestreamのためのwide_char open()APIがありません。 Read/Write file with unicode file name with plain C++/Boost,とhttps://svn.boost.org/trac10/ticket/9968MinGWの下にboost :: filestreamを持つUTF-8の名前
しかし、この問題は主にシステムコードページ外の文字を使用しようとしたときに発生していました。私の場合は、明らかにユーザーディレクトリが存在するため、システムコードページの文字のみを使用しています。これは私が後押し::パスをUTF8をbeeingてますが(boost::fstream::open
に起こる)string()
メンバ関数を呼び出すときに、システムのエンコーディングに変換するように、すべてのstd::string
のを期待して言うことができるなら、私はそう、これは動作する必要があること、
を思わせます基本的には:自動的にブースト(およびロケールを強化)を使用してその変換(UTF8 - >システムエンコード)を行う方法はありますか?ここでは完全であることを
は、ロケールを設定するための私のコードです:
#ifdef _WIN32
// On windows we want to enforce the encoding (mostly UTF8). Also using "" would use the default which uses "wrong" separators
std::locale::global(boost::locale::generator().generate("C"));
#else
// In linux/OSX this suffices
std::locale::global(std::locale::classic());
#endif // _WIN32
// Use also the encoding (mostly UTF8) for bfs paths
bfs::path::imbue(std::locale());
ええ、私はそのように下に行く必要があると思った。私は、新しいオープン関数と関数を提供するだけのboostクラスのように機能する新しいiofstreamクラスを作成することを考えていました。あなたはなぜUTF8に戻って変換していますか? 'CP_ACP'はもっと適しているでしょうか?これはかなりシンプルだと思われるので、なぜブーストはそうしないのですか? 8.3の名前のような欠点は、常にANSIかそうではないのですか? – Flamefire
ドローバックが見つかりました:これは既存のファイルでのみ機能します。したがって、ファイルが実際に存在するかどうかを確認する必要があります。これは、ワイド文字で作成を実装しようとしたときに競合状態になる可能性があります。 – Flamefire
クロスプラットフォームなので。すべての現代* nixenはUTF-8ファイル名を開き、古いコードを破壊しません。同様に_all_ Windowsファイル名は、技術的にUTF-8サブセットである、OSで許容される8.3ファイル名「トークン」に変換することができます。 –