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