Есть ли стандартный способ сделать fopen с путем к строковому файлу в Юникоде?
Вопрос
Есть ли стандартный способ сделать fopen с путем к строковому файлу в Юникоде?
Решение
В *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 использует внутренние имена файлов в Юникоде (UTF-16).Большинство библиотечных функций C (и POSIX), таких как fopen
принимать строки UTF-8 (поскольку они 8-битные) и конвертировать их внутри.
Окна
Windows API использует UTF-16 для имен файлов, но fopen
поддерживает только ASCII.Многие функции библиотеки C имеют нестандартный эквивалент, принимающий UTF-16 (wchar_t
в Windows).Например, _wfopen
вместо fopen
.
Это вопрос вашей текущей локали.в моей системе с поддержкой Unicode пути к файлам будут в Unicode.Я могу обнаружить это с помощью команды locale:
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
Кодировка путей к файлам обычно устанавливается в масштабе всей системы, поэтому, если ваш путь к файлу не соответствует локали системы, вам придется преобразовать его, возможно, с помощью команды значок v библиотека.