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 messageReceived on Fri 24 May 2013 - 14:32:43 CEST