Re: Kodierung von Datei- und Verzeichnisnamen

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Fri, 24 May 2013 14:32:32 +0200 (CEST)

Marc Santhoff wrote:
> wie kann ich rausfinden, in welcher Kodierung die Buchstaben von Datei-
> und verzeichnisnamen geschrieben sind?
>
> Ich habe mit "neueren" Namen Probleme mit Umlauten und Sonderzeichen -
> das heißt natürlich nicht ich sondern ein Programm, daß ich benutze ;) -
> und nun zufällig gesehen, daß ältere Einträge mit eben denselben Zeichen
> korrekt dargestellt werden.

Das ist das typische Symptom, wenn ein Programm ISO8859-*
mit UTF-8 (oder UCS-2 o.ä.) verwechselt. Bei manchen
Programmen kann man das konfigurieren, manche halten sich
auch einfach an die locale-Variablen, siehe unten ...

Wenn Du wissen möchtest, mit welchen Bytes Dateinamen in
einem Verzeichnis codiert sind, kannst Du einfach hd(1) auf
das Verzeichnis machen, z.B. »hd /usr/bin«. Damit bekommst
Du einen Hexdump des Verzeichnisinhalts, wo neben einigen
Binärdaten auch die Dateinamen enthalten sind.

UTF-8 erkennt man ganz einfach daran, dass bei Umlauten
mehrere Bytes codiert sind, bei ISO8859-* ist es nur eines.
Bei UCS-2 wiederum wird _jedes_ Zeichen mit zwei Bytes
codiert.

(Der Trick mit hd(1) funktioniert allerdings nicht bei allen
Dateisystemen. Bei UFS geht es, bei TMPFS dagegen nicht.)

Beispiel:

$ echo $LC_CTYPE
de_DE.ISO8859-15
$ mkdir /var/tmp/testdir
$ touch /var/tmp/testdir/fööbär
$ hd /var/tmp/testdir
00000000 36 00 00 00 0c 00 04 01 2e 00 00 00 71 0e 01 00 |6...........q...|
00000010 0c 00 04 02 2e 2e 00 00 3a 00 00 00 e8 01 08 06 |........:...è...|
00000020 66 f6 f6 62 e4 72 00 ff 00 00 00 00 00 00 00 00 |fööbär.ÿ........|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000200

Hier kann man sehen, dass die Umlaute durch einzelne Bytes
repräsentiert werden (f6 = 'ö', e4 = 'ä'), also handelt es
sich um ISO8859-*.

Die Hex-Codes für ISO8859-1 (das weitgehend identisch ist
mit ISO8859-15) kann man übrigens auch in der Datei
/usr/share/misc/latin1 nachschlagen. Oder bei Google.

> Und was beeinflußt die Auswahl der Codepage, sind das LANG und LC_*?

Siehe die Manpages environ(7) und setlocale(3).

Für die Zeichenkodierung ist LC_CTYPE zuständig. Auf welche
Werte man das setzen kann, sagt »ls /usr/share/locale«.
Ist es nicht gesetzt, gibt LANG den Default vor (ebenso für
alle andern LC_*-Variablen). LC_ALL wiederum hat Priorität
vor allen anderen Variablen.

Das Locale-System schaut also in der folgenden Reihenfolge
nach, bis es einen gesetzten Wert findet:
 - LC_ALL
 - LC_* (LC_CTYPE usw.)
 - LANG

Ich persönlich halte es so, dass ich LANG und LC_ALL *nicht*
setze, sondern die einzelnen Variablen dediziert. Das hat
den Vorteil, dass ich mit LC_CTYPE und LC_COLLATE ein Locale
mit deutschen Umlauten und Sortierung verwenden kann,
während z.B. Meldungen und Zahlen (LC_MESSAGES, LC_NUMERIC)
auf englisch ausgegeben und formatiert werden.

Gruß
   Olli

-- 
Oliver Fromme,  secnetix GmbH & Co. KG,  Marktplatz 29, 85567 Grafing
Handelsregister:  Amtsgericht Muenchen, HRA 74606, Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsreg.: Amtsgericht München,
HRB 125758, Geschäftsführer:  Maik Bachmann,  Olaf Erb,  Ralf Gebhart
FreeBSD-Dienstleistungen/-Produkte + mehr: http://www.secnetix.de/bsd
"The ITU has offered the IETF formal alignment with its
corresponding technology, Penguins, but that won't fly."
        -- RFC 2549
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Fri 24 May 2013 - 14:32:43 CEST

search this site