Какая кодировка кодировки используется для имен файлов и путей в Linux?

45

Зависит ли это от того, какую файловую систему я использую? Например, ext2 / ext3 / ext4, а также что происходит, когда я вставляю один из этих «веселых» компакт-дисков с 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/...
user12439

Ответы:

49

Как отмечают другие, на самом деле нет ответа на это: имена файлов и пути не имеют кодировки; ОС работает только с последовательностью байтов. Отдельные приложения могут по своему усмотрению интерпретировать их как кодируемые, но это варьируется.

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

С другой стороны, Qt по умолчанию предполагает, что все имена файлов закодированы в локали текущего пользователя . Отдельное приложение может предпочесть переопределить это предположение, хотя я не знаю ни одного из них, и нет внешнего переключателя переопределения.

Современные дистрибутивы Linux настроены таким образом, что все пользователи используют локали UTF-8, а пути на монтировках сторонних файловых систем переводятся в UTF-8, поэтому это различие в стратегиях обычно не имеет никакого эффекта. Однако, если вы действительно хотите быть в безопасности, вы не можете предполагать какую-либо структуру имен файлов, кроме «последовательности байтов с разделителями NUL,« / ».

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

ephemient
источник
1
"NUL-завершенная, '/' - разделенная последовательность байтов" Но без кодировки, как вы узнаете, что байт представляет '/'?
Джек
1
@ Джек Всегда '\x2F'независимо от того, как выглядит /. Заметно отличается в SJIS.
Ефемин
1
Ах хорошо. Не могли бы вы обновить ответ этой информацией? Может быть, это только потому, что я недавно работал над библиотекой преобразования кодировок, но фраза "/ / - разделенная последовательность байтов" не имеет смысла для меня.
Джек
Так как же увидеть байты имени файла в сеансе SSH в HEX?
Дим
11

Уровень linux в unix / posix не имеет значения, какую кодировку вы используете. Он хранит последовательность байтов вашей текущей кодировки как есть.

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

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

Берт Хуйбен
источник
Хорошо, тогда я, вероятно, должен проверить, какую локаль пользователь использует в настоящее время, и преобразовать ее в новую для файлов, чтобы он правильно видел имя файла в Nautilus и т. Д. Как я могу определить текущую кодировку имени файла для текущего пользователя?
мартин
1
@martin Это даже не так просто ... Различные процессы могут использовать разные кодировки, в зависимости от переменных env и языка, на котором они были написаны.
Basic
5

Это зависит от того, как вы монтируете файловую систему, просто посмотрите на опции монтирования для разных файловых систем man mount. Например iso9660, vfatи fatесть iocharsetи utf8варианты.

Адам Быртек
источник
Так что, если я монтирую его с помощью utf8, я должен также передать utf8 в системный вызов open ()?
мартин
Также я нашел это ( library.gnome.org/devel/glib/unstable/… ), которое, кажется, указывает на то, что кодировка кодировки имен файлов зависит от того, какая локаль установлена?
мартин