Есть ли стандартный способ сделать fopen с путем файла строки Unicode? - PullRequest
14 голосов
/ 28 декабря 2008

Есть ли стандартный способ сделать fopen с путем к файлу строки Unicode?

Ответы [ 3 ]

12 голосов
/ 28 декабря 2008

В * nix вы просто используете стандартный fopen (см. Дополнительную информацию в ответе TokeMacGuy или на этом форуме ) В Windows вы можете использовать _wfopen, а затем передать строку в юникоде (дополнительную информацию см. MSDN ).

Так как не существует реального общего способа, я бы обернул этот вызов в макрос вместе со всеми другими системно-зависимыми функциями.

10 голосов
/ 28 января 2016

Нет, стандартного способа нет. Есть некоторые различия между операционными системами. Вот как разные ОС обрабатывают имена файлов, отличные от 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.

4 голосов
/ 28 декабря 2008

Это вопрос вашей текущей локали. в моей системе, которая поддерживает Unicode, пути к файлам будут в Unicode. Я могу обнаружить это с помощью команды locale:

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"

Кодировка путей к файлам обычно устанавливается в масштабе всей системы, поэтому, если ваш путь к файлу не соответствует локали системы, вам потребуется преобразовать его, возможно, с помощью библиотеки iconv .

...