Какая кодировка используется при вызове fopen или open?

Когда мы вызываем системный вызов в linux, например 'open' или stdio, например 'fopen', мы должны предоставить 'const char * filename'. Мой вопрос в том, что такое кодировка, используемая здесь? Это utf-8 или ascii или iso8859-x? Это зависит от настройки системы или среды?

Я знаю, что в MS Windows есть _wopen, которые принимают utf-16.

Ответ 1

Это байтовая строка, интерпретация зависит от конкретной файловой системы.

Ответ 2

Это зависит от языкового стандарта системы. Посмотрите на вывод команды "locale". Если переменные заканчиваются в UTF-8, то ваш язык - UTF-8. Большинство современных Linux будут использовать UTF-8. Хотя Эндрю правильно, что технически это просто байтовая строка, если вы не соответствуете языку системы, некоторые программы могут работать некорректно, и будет невозможно получить правильный ввод пользователя и т.д. Лучше всего придерживаться UTF-8.

Ответ 3

При вызове файловой системы в Linux кодируются агностики, т.е. они не должны знать о конкретной кодировке. Что касается них, байтовая строка, на которую указывает аргумент filename, передается файловой системе as-is. Файловая система ожидает, что имена файлов находятся в правильной кодировке (обычно UTF-8, как упоминается Мэтью Талберт).

Это означает, что вам часто не нужно ничего делать (имена файлов рассматриваются как непрозрачные байтовые строки), но это действительно зависит от того, откуда вы получаете имя файла, и нужно ли вам каким-либо образом манипулировать именем файла.

Ответ 4

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

  • Имена файлов кодируются в локали "sytem locale", которые обычно имеют значение, но не должны совпадать с текущей локалью среды, которая отражается командой locale (но некоторые предварительно заданы в глобальной конфигурации файл).

  • Имена файлов кодируются в UTF-8, независимо от любых настроек языкового стандарта.

GTK + решает этот беспорядок, предполагая UTF-8 и позволяя переопределить его либо по текущей кодировке локали, либо по предоставленной пользователем кодировке.

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

Итак, нижняя строка: используйте либо UTF-8, либо то, что LC_ALL или LANG сообщают вам по умолчанию, и предоставьте параметр переопределения, по крайней мере, для другой альтернативы.