Какая кодировка используется при вызове fopen или open? - PullRequest
13 голосов
/ 05 января 2010

Когда мы вызываем системный вызов в Linux как "open" или функцию stdio как "fopen", мы должны предоставить "const char * filename" У меня вопрос, какая здесь используется кодировка? Это utf-8 или ascii или iso8859-x? Зависит ли это от настроек системы или среды?

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

Ответы [ 4 ]

8 голосов
/ 05 января 2010

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

4 голосов
/ 05 января 2010

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

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

4 голосов
/ 05 января 2010

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

0 голосов
/ 13 мая 2015

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

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

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

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

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

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

...