Windows 7 で C++Builder XE5 (bcc32) を使用する。
ファイル名にワイド文字が含まれているファイルを開こうとしています。私がテストしている実際のファイル名はC:\bΛx\foo.txt
. そこにある非ASCII文字は U+039B です。
このファイル名は . に正しく保存されていstd::wstring
ます。ただし、次のことを試みます。
std::ifstream f( filename.c_str() );
ファイルを開くことができません。
もちろん、標準 C++fopen
ではchar *
. ただし、Dinkumware C++ RTL 実装には、 を受け入れるオーバーロードがありwchar_t *
ます。残念ながら、そのオーバーロードの実装は を...\Embarcadero\RAD Studio\12.0\source\cpprtl\Source\dinkumware\source\fiopen.cpp
呼び出しません_wfopen
。代わりに、 を使用wcstombs
して文字列を UTF-8 に変換してから を呼び出しますfopen
。
のソースをチェックすると、最終的に UTF-8 文字列を に渡すfopen
基礎となる関数のナロー バージョンが呼び出されます。___topen
CreateFile
Sysinternals Process Monitor を使用してファイルを開こうとする試みを調べると、UTF-8 ファイル文字列でファイルを開こうとしたことが示され、オペレーティング システムはこれを拒否し、結果はNAME COLLISION
.
を使用してファイルを開くと、_wfopen( filename.c_str(), L"r" )
すべて問題なく、CI/O 関数を使用してファイルを読み取ることができますが、もちろん C++ iostream は使用できません。
std::ifstream
ファイル名に U+039B などの文字が含まれるファイルを開く方法はありますか?
std::wifstream
usingも機能しないことに注意してください(ファイル名の UTF-8 バージョンを開こうとします)。