Открытие fstream с файлом с именем файла Unicode под Windows с использованием компилятора, отличного от MSVC

Мне нужно открыть файл как std::fstream (или фактически любой другой std::ostream), когда имя файла является именем файла «Unicode».

Под MSVC у меня нестандартное расширение std::fstream::open(wchar_t const *,...)? Что я могу сделать с другими компиляторами, такими как GCC (самый важный) и, возможно, с компилятором Borland.

Я знаю, что CRTL предоставляет _wfopen, но дает C FILE * интерфейс вместо io-потоков, может есть нестандартный способ создать io-поток из FILE *? Есть ли boost::ifstream с MSVC-подобным расширением для Windows?


person Artyom    schedule 23.02.2010    source источник
comment
Вы не можете. В Mac OS X было решено, что API файлов POSIX — и, следовательно, std::fstream — будут использовать utf-8. В средах, где нет специфичных для платформы расширений (таких как gcc и bc в Windows (на самом деле они могут иметь свои собственные расширения, но это будет за пределами стандарта POSIX)) нельзя ожидать надежного доступа к функциям времени выполнения c и c++. файловая система предоставляет файлы с не-ascii-символами в имени.   -  person Chris Becke    schedule 23.02.2010
comment
@Chris У меня нет проблем с библиотекой, поддерживающей UTF-8 - она ​​идеально подходит для меня. Проблема в том, что Windows не поддерживает UTF-8   -  person Artyom    schedule 23.02.2010
comment
хакерский обходной путь для MinGW находится в stackoverflow.com/questions/6524821/opening -stream-через-функцию   -  person marcin    schedule 02.03.2015


Ответы (3)


К сожалению, стандартного способа сделать это нет, хотя C++0x (1x?) обещает это сделать. До тех пор вы правильно предполагали, что решение можно найти в Boost, однако библиотека, которую вы ищете, — это Boost.Filesystem.

Boost.Filesystem внутренне использует широкие строки по умолчанию для своей универсальной системы путей, поэтому в этом отношении нет проблем с юникодом.

person Kornel Kisielewicz    schedule 23.02.2010
comment
У вас есть ссылка на С++ 0X? Помню обсуждения, но никаких выводов, и я ничего не нашел в последнем черновике. - person AProgrammer; 23.02.2010
comment
Проблема в том, что boost::filesystem не поддерживает wpath в MinGW/GCC, потому что конфигурация boost по какой-то причине определяет BOOST_NO_STD_WSTRING (даже широкие строки работают достаточно хорошо в mingw). - person Artyom; 23.02.2010
comment
Я еще немного поискал и нашел это: open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#454, по-видимому, нет решения до библиотеки TR2. - person AProgrammer; 23.02.2010
comment
Я думаю, что добавление wchar_t не является хорошим решением. Я думаю, что MS CRTL просто должен поддерживать строки UTF-8. Windows — единственная операционная система, которая использует широкий API для основных частей. - person Artyom; 24.02.2010
comment
@art проблема в том, что Windows поддерживала Unicode до того, как был изобретен utf8, и в то время широкий был лучшим выбором. Жребий брошен. - person David Heffernan; 19.06.2011

В настоящее время нет простого решения.

Вам нужно создать свой собственный буфер потока, который использует _wfopen под капотом. Вы можете использовать для этого, например, boost::iostream

person Artyom    schedule 19.06.2011

Преобразуйте имя файла Unicode в строку char*, используя что-то вроде wcstombs() или WideCharToMultiByte() (что дает вам гораздо больший контроль над задействованными кодовыми страницами).

Затем используйте преобразованное имя файла, чтобы открыть файл.

person Michael Burr    schedule 23.02.2010
comment
Имя файла включает символы Юникода, которые могут не быть представлены в кодовой странице текущей локали (например, символы иврита не могут быть представлены в 8-битной локали Latin1), также Windows не поддерживает кодовые страницы UTF-8. Так что нет, это не работает. - person Artyom; 23.02.2010