[Python-de] filesystemencoding

"Martin v. Löwis" martin at v.loewis.de
Mit Apr 5 20:08:09 CEST 2006


jens wrote:
> Ich hab mir TestDaten gemacht:
>        <verz>  ./dir eins/
>        <verz>  ./dir zwei äöüß/
>        <datei> ./file eins.txt
>        <datei> ./file zwei äöüß.txt
> 
> Im mc sehe ich die Namen richtig. Mit dem ls Befehl allerdings nicht. Da 
> sind nur Fragezeichen statt den Umlauten.

Dann sind die Umlaute vermutlich mit ISO-8859-1 kodiert, und nicht mit
UTF-8. Schalte Deine locale mal auf ISO-8859-1, und probier dann ls
noch mal.

Alternativ: Erzeuge mal eine Datei "ohne" mc, z.B. mit

touch äöu.txt

Probier' dann ls, und dann mc.

Solange das alles nicht zusammen passt, ist es kein Wunder,
wenn Python damit nicht klar kommt.

> Also hab ich nochmal ein neuen Test gemacht. Diesmal hab ich per Samba 
> von Windows aus neue Dateien mit Umlauten gemacht. Siehe da, nun klappt 
> es direkt! Also os.listdir() spuckt direkt unicode aus und os.stat() und 
> os.path.* arbeiten richtig.

Samba nimmt per default an, dass Dateinamen unter Linux UTF-8-kodiert
sind (Einstellung "unix charset", siehe smb.conf(5)).

> Also liegt das ganze Problem wohl an meiner Linux installation :(

Genau. Du musst Dich entscheiden, welches Encoding Dateinamen auf Deinem
System haben sollen, und dass dann konsequent konfigurieren.

Meine Empfehlung: Dateinamen sollten UTF-8-kodiert sein. Da Deine locale
schon richtig ist, musst Du nun noch Deine Terminalemulation anpassen.
Wie man das macht, hängt vom konkreten Programm ab.

Bei (KDEs) konsole kannst Du beispielsweise mal

echo $'\033%G'

ausführen: das schaltet die konsole in UTF-8-Modus. Wenn Du dann ls
machst, sollten die Samba-erzeugten Dateinamen richtig angezeigt werden.
Alternativ kannst Du das encoding auch über Einstellungen/Kodierung
umschalten.

> Nur sollte Python in dem Falle nicht irgendwie trotzdem funktionieren?

Nein, das ist technisch nicht möglich. Du hast (über die locale) Python
erklärt, dass Deine Dateinamen UTF-8-kodiert sind. Es liest (mittels
readdir) die Dateinamen ein, und stellt fest, dass es nicht UTF-8
sein *kann*. Was es dann aber ist, kann es nicht wissen, und fügt
deshalb byte strings in das listdir-Ergebnis ein.

> Kompliziert wird es, weil ich ja die Dateinamen als Webseite anzeigen 
> lasse, mit Links. Diese Links sollten auch funktionieren ;)

Ja, an dieser Stelle hat Unix große Mängel. Langfristig die einzige
Lösung ist die Verwendung nur noch von UTF-8 locales, und die
durchgängige Verwendung dieses Encodings in Dateinamen, Daten usw.

Ciao,
Martin