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

StackOverflow https://stackoverflow.com/questions/396567

  •  29-08-2019
  •  | 
  •  

Вопрос

Есть ли стандартный способ сделать 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 библиотека.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top