Нет, стандартного способа нет. Есть некоторые различия между операционными системами. Вот как разные ОС обрабатывают имена файлов, отличные от ASCII.
Linux
В Linux имя файла - это просто двоичная строка. В большинстве современных дистрибутивов принято использовать UTF-8 для имен файлов, отличных от ASCII. Но в начале было принято кодировать имена файлов как ISO-8559-1. Как правило, каждое приложение выбирает кодировку, поэтому вы можете использовать разные кодировки в одной и той же файловой системе. Переменная окружения LANG
может дать вам подсказку о предпочтительной кодировке. Но в наши дни вы, вероятно, можете использовать UTF-8 везде.
Это не без проблем, потому что имя файла, содержащее недопустимую последовательность UTF-8, идеально подходит для большинства файловых систем Linux. Как бы вы указали такое имя файла, если вы поддерживаете только UTF-8? В идеале вы должны поддерживать как UTF-8, так и двоичные имена файлов.
OS X
Файловая система HFS в OS X использует внутренние имена файлов Unicode (UTF-16). Большинство функций библиотеки C (и POSIX), таких как fopen
, принимают строки UTF-8 (поскольку они 8-битные совместимы) и конвертируют их внутри.
Windows
Windows API использует UTF-16 для имен файлов, но fopen
поддерживает только ASCII. Многие функции библиотеки C имеют нестандартный эквивалент, который принимает UTF-16 (wchar_t
в Windows). Например, _wfopen
вместо fopen
.