Мне трудно понять, как работает кодировка имени файла. На unix.SE я нахожу противоречивые объяснения.
Имена файлов хранятся в виде символов
Процитирую другой ответ: Несколько вопросов о кодировке символов файловой системы в Linux.
[…] Как вы упоминаете в своем вопросе, имя файла UNIX - это просто последовательность символов; ядро ничего не знает о кодировке, которая полностью является концепцией пользовательского пространства (т.е. уровня приложения).
Если имена файлов хранятся в виде символов, должна использоваться какая-то кодировка, поскольку в конечном итоге имя файла должно заканчиваться последовательностью битов или байтов на диске. Если пользователь может выбрать любую кодировку для сопоставления символов с последовательностью байтов, которая подается в ядро, можно создать любую последовательность байтов для действительного имени файла.
Предположим следующее: пользователь использует случайную кодировку X , которая переводит файл foo
в последовательность байтов α и сохраняет его на диск. Другой пользователь использует кодирующий Y . В этой кодировке α переводится как /
, что не допускается в качестве имени файла. Однако для первого пользователя файл действителен.
Я предполагаю, что этот сценарий не может произойти.
Имена файлов хранятся в виде двоичных объектов
Процитирую другой ответ: Какая кодировка charset используется для имен файлов и путей в Linux?
Как отмечают другие, на самом деле нет ответа на это: имена файлов и пути не имеют кодировки; ОС работает только с последовательностью байтов. Отдельные приложения могут по своему усмотрению интерпретировать их как кодируемые, но это варьируется.
Если система не работает с символами, как можно запретить использование определенных символов (например, /
или NULL
) в именах файлов? Там нет понятия /
без кодировки.
Объяснение может состоять в том, что файловая система может хранить имена файлов, содержащие любой
символ, и только пользовательские программы, принимающие во внимание кодировку, будут подавлять имена файлов, содержащие недопустимые символы. Это, в свою очередь, означает, что файловые системы и ядро могут без каких-либо затруднений обрабатывать имена файлов, содержащие /
.
Я также предполагаю, что это неправильно.
Где происходит кодирование и где накладывается ограничение, запрещающее использование определенных символов?