




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