C++プロジェクトでは、ファイル(fstream::open()
)大きな問題です)。私のプログラムのWindowsビルドは悲惨に失敗します。fstream :: open()Windows上でUnicodeまたは非Ascii文字が動作しない(std :: ios :: out付き)
ファイル "A"(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でエンコードされ、その後のLatin1(0xE4)をUTF-8から変換されました。私はQtを使用していますので、QString::fromUtf8(s.c_str()).toLocal8Bit().constData()
です。ファイルを読み込み用に開くことができますが、書き込み用に開くことができないのはなぜですか?
ファイル "и"(UTF-8 0xD0 0xB8)
同じコード、全く動作しません。
この文字は、Windows-1252文字セットには入りません。どのように私はそのようなfstreamを開くことができます(私はMSVCを使用していないので、no fstream::open(const wchar_t*, ios_base::openmode)
)?
私は、Windowsのファイル名がUTF-16でエンコードする必要があると思うし、あなたは特別なWindowsのファイルを使用する必要があります( '_wfopen'など)を使用して、長い名前でファイルにアクセスします。また、短い名前を使用することもできます。 –
あなたはどのコンパイラとCライブラリを使用していますか?例えば、MinGWを使用している場合でも、['_wfopen'](http://msdn.microsoft.com/en-us/library/yeby3zcb%28v=vs.80)などのMS CRTの機能を使用できます%29.aspx)。別のCランタイム(Cygwin GCCのlibcなど)を使用している場合は、そのランタイムライブラリのUnicodeサポートが必要です。 –
あなたのCおよびC++標準ライブラリはUnicodeをサポートする必要があります(つまり、UTF-8入力文字列をUTF-16に変換してから、 'CreateFileW'を呼び出す必要があります)。もしそうでなければ、あなたは運が悪いです。おそらく 'CreateFileW'を直接呼び出す必要があります。 – Philipp