Как читать двоичный файл с unicode filename С++?

В проекте, над которым я работаю, я имею дело с довольно многими строковыми манипуляциями; строки считываются из двоичных файлов вместе с их кодировкой (которая может быть одиночным или двойным байтом). По сути, я прочитал строковое значение как vector<char>, прочитал кодировку, а затем конвертировал все строки в wstring для согласованности.

Это работает достаточно хорошо, однако сами имена файлов могут быть двухбайтовыми символами. Я полностью зациклен на том, как фактически открыть входной поток. В CI будет использоваться функция _wfopen, проходящая wchar_t* path, но wifstream, похоже, ведет себя по-другому, поскольку она специально предназначена для чтения двухбайтовых символов из файла, а не для чтения одиночных байтов из файла с двухбайтовым именем файла.

Каково решение этой проблемы?

Изменить: Поиск в сети, похоже, нет никакой поддержки для этого вообще в стандартном С++ (например, см. это обсуждение). Однако мне интересно, добавляет ли С++ 11 что-то полезное в этой области.

Ответ 1

Как строка, которую вы передаете для открытия, сопоставляется с именем файла зависит от реализации. В среде Unix она передается почти буквально, обрабатываются только '/' и '\0' специально. В других средах действуют другие правила, и я были проблемы в прошлом, потому что я написал файл в Unix, и ничего не мог с этим сделать под Windows (который относится к ':' в имени файла).

Другой вопрос, откуда берутся эти файлы. Как упоминалось выше, не может быть абсолютно никакого способа открыть их на вашем system: имя файла с ':' просто не может быть открыто в Окна. В Unix, если вы закончите с символами '\0' в filename, вы, вероятно, тоже не можете их прочитать, а UTF16 имена файлов будут иметь '\0' символы в них под Unix. Вы можете только использовать собственные инструменты на система, которая сгенерировала файлы для их переименования.

Мне стало менее ясно, как вы можете получить такие имена файлов в Unix диска в первую очередь. Как сервер SMB, такой как Samba отобразить имена файлов UTF16, когда он служит в окне Windows? Или Сервер NFS. Я думаю, что такие вещи также существуют под Windows.