Welche Zeichensatzkodierung wird für Dateinamen und Pfade unter Linux verwendet?

45

Kommt es darauf an, welches Dateisystem ich benutze? Zum Beispiel ext2 / ext3 / ext4, aber was passiert auch, wenn ich eine dieser "Joliet" -CD-ROMs mit ISO 9660 einlege? Ich habe gehört, dass POSIX irgendeine Spezifikation für die Zeichensatzkodierung von Dateinamen enthält.

Ich frage mich im Wesentlichen, ob ich einen UTF-8-codierten Dateinamen habe, welche Verarbeitung / Abdeckung muss ich vornehmen, bevor ich ihn an eine Datei-E / A-API in Linux übergebe?

martin
quelle
Die folgenden Antworten besagen, dass das Betriebssystem und das Dateisystem sich nicht um Kodierungen kümmern. Einige Dateisysteme, wie z. B. HFS +, kümmern sich sehr darum. Ich glaube, HFS + benötigt UTF-8, das intern in einen eingeschränkten UTF-16-Dialekt konvertiert wird. NTFS hat auch ein ähnliches Problem, aber mir sind die Details nicht klar.
Zmccord
HFS + erfordert auch, dass Namen dekomponiert werden, was mit der Tendenz von Linux, vorkomponierte Namen zu verwenden, nicht gut zusammenpasst. web.archive.org/web/20080518105836/http://developer.apple.com/…
user12439

Antworten:

49

Wie von anderen bemerkt, gibt es keine wirkliche Antwort darauf: Dateinamen und Pfade haben keine Kodierung; Das Betriebssystem behandelt nur die Reihenfolge der Bytes. Einzelne Anwendungen interpretieren sie möglicherweise so, dass sie in irgendeiner Weise codiert sind. Dies ist jedoch unterschiedlich.

Insbesondere geht Glib (von Gtk + Apps verwendet) davon aus, dass alle Dateinamen unabhängig vom Gebietsschema des Benutzers UTF-8-codiert sind . Dies kann mit den Umgebungsvariablen G_FILENAME_ENCODING und G_BROKEN_FILENAMES überschrieben werden .

Andererseits geht Qt standardmäßig davon aus, dass alle Dateinamen im Gebietsschema des aktuellen Benutzers codiert sind . Eine einzelne Anwendung kann diese Annahme außer Kraft setzen, obwohl mir keine bekannt ist und es keinen externen Override-Schalter gibt.

Moderne Linux-Distributionen sind so eingerichtet, dass alle Benutzer UTF-8-Gebietsschemas verwenden und Pfade auf fremden Dateisystem-Mounts in UTF-8 übersetzt werden, sodass dieser Unterschied in den Strategien im Allgemeinen keine Auswirkungen hat. Wenn Sie jedoch wirklich sicher sein möchten, können Sie keine Struktur für Dateinamen über "NUL-terminierte, '/' - begrenzte Folge von Bytes" hinaus annehmen.

(Beachten Sie auch, dass das Gebietsschema prozessabhängig sein kann. Zwei unterschiedliche Prozesse, die vom selben Benutzer ausgeführt werden, befinden sich möglicherweise in unterschiedlichen Gebietsschemata, indem einfach unterschiedliche Umgebungsvariablen festgelegt werden.)

vergänglich
quelle
1
"NUL-terminiert, '/' - begrenzte Folge von Bytes" Aber woher wissen Sie ohne Kodierung, welches Byte '/' darstellt?
Jack
1
@Jack Immer, '\x2F'egal wie es aussieht /. Bemerkenswert anders in SJIS.
Ephemient
1
Ah, okay. Würden Sie in Betracht ziehen, die Antwort mit diesen Informationen zu aktualisieren? Vielleicht liegt es daran, dass ich kürzlich an einer Zeichensatzkonvertierungsbibliothek gearbeitet habe, aber der Satz "'/' - durch Bytes begrenzte Folge" macht für mich keinen Sinn.
Jack
So wie man Bytes des Dateinamens in der SSH Sitzung in HEX sieht?
Dims
11

Der Unix / Posix-Ebene von Linux ist es egal, welche Codierung Sie verwenden. Es speichert die Bytesequenz Ihrer aktuellen Kodierung wie sie ist.

Ich denke, diese Mount-Optionen helfen Ihnen dabei, bestimmte Dateisysteme, die einen Zeichensatz definieren, in Ihren Systemzeichensatz zu konvertieren. (CD-ROMs, NTFS und die FAT-Varianten verwenden einige Unicode-Varianten).

Ich wünschte, Unix definiert ein globales System-Codierung, aber es ist eigentlich eine Einstellung pro Benutzer. Wenn Sie also eine andere Codierung als Ihren Kollegen definieren, werden Ihre Dateinamen anders angezeigt.

Bert Huijben
quelle
Ok, dann sollte ich wahrscheinlich überprüfen, welches Gebietsschema der Benutzer gerade verwendet, und für neue Dateien in dieses konvertieren, damit er den Dateinamen in Nautilus usw. korrekt sieht. Wie kann ich feststellen, wie der aktuelle Dateinamenzeichensatz für den aktuellen Benutzer ist?
Martin
1
@ Martin Es ist nicht einmal so einfach ... Verschiedene Prozesse können unterschiedliche Codierungen verwenden, abhängig von den Umgebungsvariablen und der Sprache, in der sie geschrieben wurden.
Basic
5

Es hängt davon ab, wie Sie das Dateisystem bereitstellen. Schauen Sie sich lediglich die Bereitstellungsoptionen für verschiedene Dateisysteme in an man mount. Zum Beispiel iso9660, vfatund fathaben iocharsetund utf8Optionen.

Adam Byrtek
quelle
Wenn ich es also mit utf8 mounte, sollte ich dann auch utf8 an open () syscall übergeben?
Martin
Außerdem habe ich dies gefunden ( library.gnome.org/devel/glib/unstable/… ), was darauf hinzudeuten scheint, dass die Zeichensatzkodierung von Dateinamen von dem eingestellten Gebietsschema abhängt.
Martin