В проекте 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)
)?
_wfopen
и т. д.) для доступа к файлам по их длинному имени. В качестве альтернативы вы можете использовать короткое имя. - person Kerrek SB   schedule 13.05.2012_wfopen
. Если вы используете другую среду выполнения C (например, libc Cygwin GCC), то вы зависите от поддержки Unicode в этой библиотеке времени выполнения. - person Adam Rosenfield   schedule 14.05.2012CreateFileW
). Если они этого не сделают, вам не повезло — тогда вам, вероятно, нужно вызватьCreateFileW
напрямую. - person Philipp   schedule 17.05.2012std::wfstream
, но его методopen
также принимает толькоconst char*
для имени файла. Если вы хотите иметь возможность открывать имена файлов в формате Unicode, вам нужно либо использовать библиотеку C stdio, либо полностью буферизовать данные файла, прочитав их все в память и используяstd::stringstream
для анализа данных. - person Adam Rosenfield   schedule 18.05.2012