Есть два возможных ответа:
Если вы хотите убедиться, что все имена файлов Unicode представимы, вы можете жестко закодировать предположение, что файловая система использует имена файлов UTF-8. Это «современный» Linux-подход к настольным приложениям. Просто преобразуйте ваши строки из wchar_t
(UTF-32) в UTF-8 с библиотечными функциями (iconv
будет работать хорошо) или вашей собственной реализацией (но посмотрите спецификации, чтобы не ошибиться, как это сделал Шелвин) , затем используйте fopen
.
Если вы хотите сделать что-то более стандартизированным способом, вы должны использовать wcsrtombs
для преобразования строки wchar_t
в многобайтовую строку char
в кодировке локали (которая, в любом случае, в любом случае является UTF-8) современная система) и использовать fopen
. Обратите внимание, что для этого необходимо предварительно установить языковой стандарт с помощью setlocale(LC_CTYPE, "")
или setlocale(LC_ALL, "")
.
И, наконец, не совсем ответ, а рекомендация:
Хранение имен файлов в виде wchar_t
строк, вероятно, ужасная ошибка. Вместо этого следует хранить имена файлов в виде абстрактных байтовых строк и преобразовывать их только в wchar_t
точно для своевременного отображения их в пользовательском интерфейсе (если это даже необходимо; многие инструментарии пользовательского интерфейса сами используют простые байтовые строки и выполняют интерпретацию как персонажи для вас). Таким образом вы устраняете множество возможных неприятных угловых случаев и никогда не сталкиваетесь с ситуацией, когда некоторые файлы недоступны из-за их имен.