Мені важко зрозуміти, як працює кодування імені файлів. На unix.SE я знаходжу суперечливі пояснення.
Імена файлів зберігаються як символи
Напрошу ще одну відповідь: Кілька питань щодо кодування символів файлової системи на Linux
[…] Як ви згадуєте у своєму запитанні, ім'я файлу UNIX - це лише послідовність символів; ядро нічого не знає про кодування, яке цілком є концепцією простору користувача (тобто на рівні додатків).
Якщо імена файлів зберігаються як символи, повинно бути якесь кодування, оскільки нарешті ім'я файлу має закінчитися бітом або байтом на диску. Якщо користувач може обрати будь-яке кодування для відображення символів у послідовності байтів, яка подається в ядро, можна створити будь-яку послідовність байтів для дійсного імені файлу.
Припустимо наступне: Користувач використовує випадкове кодування X , яке переводить файл foo
у послідовність байтів α і зберігає його на диску. Інший користувач використовує кодує Y . У цьому кодуванні α перекладається на /
, що не дозволено як ім'я файлу. Однак для першого користувача файл дійсний.
Я припускаю, що такого сценарію не може статися.
Імена файлів зберігаються у вигляді двійкових крапок
Процитую ще одну відповідь: Яке кодування шаблонів використовується для назви файлів та шляхів у Linux?
Як зазначають інші, насправді немає відповіді на це: у іменах і каналах немає кодування; ОС працює лише з послідовністю байтів. Окремі додатки можуть вирішити інтерпретувати їх як певне кодування, але це різниться.
Якщо система не працює з символами, то як окремі символи (наприклад, /
або NULL
) можуть бути заборонені у назвах файлів? Існує поняття /
без кодування.
Поясненням цього є те, що файлова система може зберігати імена файлів, що містять будь-який
символ, і тільки користувацькі програми, які враховують кодування, враховують імена файлів, що містять недійсні символи. Це, в свою чергу, означає, що файлові системи та ядро можуть без особливих труднощів обробляти імена файлів, що містять /
.
Я також припускаю, що це неправильно.
Де відбувається кодування і де існує обмеження, що не дозволяє певні символи?