Dateinamen mit Sonderzeichen unter Linux und Windows

german

#1

Wird in einer UCS Umgebung von Linux und Windows Rechnern auf Dateifreigaben gearbeitet, kann es bei der Verwendung von Dateinamen mit Sonderzeichen zu Problemen kommen.

Beispiel

  1. Auf einem Windows Client wird eine Datei mit Sonderzeichen im Namen auf einer Samba Freigabe angelegt - Gesprächsprotokoll.sxw. Auf einem Linux Rechner wird der Dateiname als Gespr?chsprotokoll.sxw angezeigt.

  2. Auf einem Linux Client wird eine Datei mit Sonderzeichen in einem Verzeichnis angelegt, das über Samba an Windows Rechner freigegeben ist - Geschäftsbericht.sxw. Der Dateiname wird unter Windows als Gesch_ftsbericht.sxw angezeigt.

Hintergrund

Linux und Windows verwenden unterschiedliche Zeichensätze zur Kodierung von Dateinamen. In einem Zeichensatz (UTF-8, latin-1, iso8859-1…) werden Ordnungszahlen einem Zeichen zugeordnet, der Dateiname besteht also nur aus Ordnungszahlen, die über den aktuell verwendeten Zeichensatz in Zeichen umgewandelt werden können. Der Unterschied zwischen den Zeichensätzen macht sich nicht bei allen Zeichen bemerkbar. Alle Zeichensätze enthalten den 7-Bit ASCII Zeichensatz (a-z, A-Z, 0-9, ‘.’, ‘,’…), diese Zeichen haben in allen Zeichen identische Ordnungszahlen. Darüber hinaus enthalten Zeichensätze sprachspezifische Sonderzeichen, wie z.B. Umlaute, deren Zuordnungen zu Ordnungszahlen nicht vereinheitlicht sind. (Siehe auch http://de.wikipedia.org/wiki/Zeichensatz)

Samba ist so voreingestellt, dass es unter Linux Dateinamen im Zeichensatz UTF-8 anlegt, beim Zugriff von Windows Dateinamen nach CP850 konvertiert. Wird von einem Windows Client eine Datei erzeugt, wird der Dateiname auf dem Samba Server nach UTF-8 umgewandelt. Unter UCS wird betriebssystemweit aus Kompatibilitätsgründen der Zeichensatz latin1 verwendet. Dateien, die von einem Linux Client latin1 kodiert auf einer Samba Freigabe erzeugt wurde, werden beim Zugriff von Windows auf die Freigabe nach CP850 konvertiert. Samba geht aber per Voreinstellung davon aus, dass die Konvertierung auf Grundlage von UTF-8 (und nicht von latin1) vorgenommen wird.

Die Fehler in der Darstellung der Zeichen unter Linux entstehen, weil Samba die Dateinamen von Windows CP850 nach UTF-8 konvertiert hat, Linux aber von latin1 ausgeht. Entsprechend entstehen die Darstellungsfehler unter Windows, weil die Datei beim Anlegen unter Linux im Zeichensatz latin1 kodiert wurde, Samba aber von UTF-8 nach CP850 umwandelt.

Lösung

Samba ist wie beschrieben in der Lage, Dateinamen von einem Zeichensatz in einen anderen zu konvertieren, auch von latin1 nach CP850. Die Einstellungen in Samba, welche Zeichensätze unter Linux und unter Windows verwendet werden sollen, können über die Univention Baseconfig Variablen samba/charset/unix und samba/charset/dos verwaltet werden. Die Einstellung wird mit dem folgenden Befehl auf allen UCS Samba Servern vorgenommen:

# univention-baseconfig set samba/charset/unix=latin1

Nach einem Neustart des Samba Servers werden unter Windows erzeugte Dateien latin-1 kodiert abgelegt, Sonderzeichen im Dateinamen werden auch unter Linux korrekt angezeigt.

Konvertierung von Dateien

Da die Kodierung von Dateien von Samba nachträglich nicht verändert wird, werden alle Dateien, die vor Änderung der Einstellung angelegt wurden, nach der Umstellung fehlerhaft dargestellt. Samba konvertiert beim Zugriff von Windows die ursprünglich in UTF-8 kodierten Dateinamen von latin1 nach CP850 Um dies zu korrigieren, müssen die Dateinamen konvertiert werden. Mit UCS 1.3-2 wird das Paket convmv ausgeliefert. Mit convmv kann die Kodierung von Dateinamen verändert werden. convmv erwartet neben der Angabe des Dateinamens den bisherigen Zeichensatz (from) und den gewünschten Zeichensatz (to) als Aufrufparameter. Vor der eigentlichen Konvertierung sollte eine Sicherungskopie der betroffenen Dateien angelegt werden.

root@master # ls
GesprÀchsprotokoll.doc
root@master # convmv --notest -r -f utf8 -t iso-LATIN-1 GesprÀchsprotokoll.doc
mv "./GesprÀchsprotokoll.doc"  "./Gesprächsprotokoll.doc"
Ready!
root@master # ls
Gesprächsprotokoll.doc