Яке кодування шаблонів використовується для назви файлів та шляхів у Linux?


45

Це залежить від того, яку файлову систему я використовую? Наприклад, ext2 / ext3 / ext4, але і що трапляється, коли я вставляю один із цих "joliet" CD-ROM з ISO 9660? Я чув, що POSIX містить якусь специфікацію для кодування шаблонів імен файлів?

По суті, мені цікаво, якщо я отримав закодоване ім'я файлу UTF-8, яку обробку / обкладинку мені потрібно зробити, перш ніж передати її до файлу API вводу / виводу в Linux?


У відповідях нижче йдеться про те, що ОС та файлова система не переймаються кодуванням. Деякі файлові системи, такі як HFS +, дуже важливі. Я вважаю, що HFS + вимагає UTF-8, який він внутрішньо перетворює на діалект з обмеженим доступом UTF-16. NTFS також має подібне питання, але мені детально не зрозуміло.
zmccord

HFS + також вимагає, щоб імена були розкладені, що не зіграє з тенденцією Linux використовувати попередньо складені. web.archive.org/web/20080518105836/http://developer.apple.com/…
користувач12439

Відповіді:


49

Як зазначають інші, насправді немає відповіді на це: у іменах і каналах немає кодування; ОС працює лише з послідовністю байтів. Окремі додатки можуть вирішити трактувати їх як певне кодування, але це різниться.

Зокрема, Glib (використовується програмами Gtk +) передбачає, що всі імена файлів кодуються UTF-8, незалежно від мови користувача . Це може бути замінено змінними середовища G_FILENAME_ENCODING та G_BROKEN_FILENAMES .

З іншого боку, Qt за замовчуванням припускає, що всі імена файлів закодовані в локальній точці користувача . Індивідуальна програма може вирішити це припущення, хоча я не знаю жодного з цих дій, і немає зовнішнього перемикача переопрацювання.

Сучасні дистрибутиви Linux налаштовані так, що всі користувачі використовують локалі UTF-8, а шляхи на кріпленнях іноземної файлової системи переводяться на UTF-8, тому ця різниця в стратегіях взагалі не впливає. Однак, якщо ви дійсно хочете бути в безпеці, ви не можете припустити будь-яку структуру щодо імен файлів, що не перевищують "NUL-terminated", / / ​​- обмежена послідовність байтів ".

(Також зауважте: локал може залежати від процесу. Два різні процеси, які виконуються одним і тим же користувачем, можуть бути в різних локалях, просто встановивши різні змінні середовища.)


1
"NUL-terminated, '/' - обмежена послідовність байтів" Але без кодування, як ви знаєте, що байт являє собою "/"?
Джек

1
@Jack Завжди '\x2F'незалежно від того, як це виглядає /. Помітно відмінна у SJIS.
ефемієнт

1
Ага, гаразд. Чи могли б ви поновити відповідь за допомогою цієї інформації? Можливо, це лише тому, що я нещодавно працював над бібліотекою перетворення шаблонів, але фраза "'/' - обмежена послідовність байтів" для мене не має сенсу.
Джек

То як бачити байти імені файлу в сесії SSH в HEX?
Дімс

11

Шару unix / posix linux не важливо, яке кодування ви використовуєте. Він зберігає послідовність байтів вашого поточного кодування таким, яким він є.

Я думаю, що ці параметри кріплення є, щоб допомогти вам конвертувати конкретні файлові системи, що визначають шаблони, у ваш системний набір. (Варіанти CDROM, NTFS та FAT використовують деякі варіанти unicode).

Я б хотів, щоб Unix визначила глобальне кодування системи, але це фактично налаштування на кожного користувача. Отже, якщо ви визначите інше кодування, то ваш колега, ваші імена файлів відображатимуться інакше.


Гаразд, тоді я, мабуть, повинен перевірити, яку локальну систему користувач наразі використовує, і перетворити її в нові файли, щоб він побачив ім'я файлу правильно в Nautilus тощо.
Мартін

1
@martin Це навіть не так просто ... Різні процеси можуть використовувати різні кодування, залежно від змінних env та мови, на якій вони були написані.
Basic

5

Це залежить від способу монтажу файлової системи, просто подивіться варіанти монтажу для різних файлових систем man mount. Наприклад iso9660, vfatі fatє, iocharsetі utf8варіанти.


Отже, якщо я монтую його за допомогою utf8, чи слід також передавати utf8 у відкритий () syscall?
Мартін

Також я знайшов це ( library.gnome.org/devel/glib/unstable/… ), який, здається, вказує на те, що кодування шаблонів імен файлів залежить від того, яку локальну установку встановлено?
Мартін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.