Подтвердить что ты не робот

Есть ли стандартный способ сделать fopen с помощью файла строки в формате unicode?

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

4b9b3361

Ответ 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.