Während der Arbeit mit einem Kollegen habe ich ein seltsames Problem festgestellt, das mit der Codierung zusammenhängt. Wir sind mit einigen Bildern arbeiten , die einfach genug Dateinamen haben wie city.gif
oder wine.gif
, aber wie man die Dinge erwarten könnte noch komplizierter , wenn Sonderzeichen wie é
, ë
, à
. Wir arbeiten auch mit niederländischen Daten, die diese Zeichen enthalten, z . B. café
( Pub ). (Wir haben keine Kontrolle über den Ursprung der Dateien.) Hier treten die Probleme auf. Die folgenden Dateinamen sind nur ein Beispiel. Das Problem tritt auch bei anderen Zeichen mit diakritischen Zeichen auf.
café-2.png
cafetaria.png
café.png
Das erste und letzte Element sollte ein akzentuiertes e enthalten (Akzent aigu, é
). So wird es unter Linux (CentOS 6 & 7) in einem Terminal beim Ausführen angezeigt ls
. Aber hier kommt Windows! (Verwenden von Windows 10, 64 Bit.) Wenn Sie unter Windows über SSL mit unserem Server verbunden sind und dann anrufen ls
, sieht die obige Liste folgendermaßen aus:
café-2.png
cafetaria.png
caf▒.png
Wie Sie hoffentlich sehen können, hat die erste Zeile immer noch das akzentuierte e é
, die dritte jedoch nicht. Stattdessen sehe ich ▒
dieses Zeichen - das medium shade
in Unicode (9618 Dezimal) ist. Das ist an sich schon seltsam. Wenn ich jedoch über SFTP mit Filezilla (immer noch unter Windows) eine Verbindung herstelle, sehe ich Folgendes:
café-2.png
cafetaria.png
café.png
Jetzt haben sich die Dinge umgedreht: In der ersten é
hat sich die Reihenfolge geändert und in der dritten ist alles in Ordnung. Ich habe hier festgestellt , dass dies höchstwahrscheinlich auf eine Latin-1 <-> UTF-8-Konvertierung zurückzuführen ist, die fehlgeschlagen ist, wenn ich es richtig verstanden habe. Aber das kann doch nicht alles sein, oder?
Linux zeigt alles wie erwartet, Windows zeigt scheinbar inkonsistentes Verhalten, abhängig von der Art und Weise, wie wir den Dateinamen (SSH (Putty) oder SFTP (Filezilla)) anzeigen. Gibt es eine Möglichkeit, diese Dateinamen zu "normalisieren" - dh zu bearbeiten - und sicherzustellen, dass sie auf jedem Betriebssystem gleich sind? oder zumindest konsequent, und wenn ja, wie? UTF-8
ist unsere Kodierung der Wahl.
Auch wenn dies nur ein ästhetisches Problem sein mag, ist es dies nicht. Wenn ich versuche, Dinge über SFTP in Windows von unserem Linux-Server herunterzuladen, kann ich die Dateien mit dem oben genannten Problem nicht herunterladen. Filezilla wird einen Fehler wie z Can't download file café-2.png: café-2.png does not exist on the server
. Was mir scheint, dass Filezilla das Verzeichnis und den Dateinamen liest, es in einer Codierung interpretiert, eine GET-Anfrage mit ihrer Interpretation an den Server sendet, diese Interpretation sich jedoch vom Linux-Dateinamen unterscheidet, sodass die Datei folglich nicht gefunden wird.
Letztendlich wäre es schön, wenn es eine Lösung gäbe, obwohl ich auch daran interessiert bin, warum dies passiert. Tritt es auf, weil die Bilddateien möglicherweise auf verschiedenen Betriebssystemen erstellt wurden? Tritt es auf, weil der Linux-Server sie falsch interpretiert oder Windows durcheinander bringt? Hoffentlich gibt es eine Lösung, bei der wir einfach unseren Systemadministrator kontaktieren und ihn bitten können, einen Schalter in der Serverkonfiguration einzuschalten, aber ich fürchte, das ist nicht so einfach.
python -c "import sys; print(repr(sys.argv[1]))" café-2.png
und python -c "import sys; print(repr(sys.argv[1]))" café.png
?