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.
quelle
python -c "import sys; print(repr(sys.argv[1]))" café-2.png
undpython -c "import sys; print(repr(sys.argv[1]))" café.png
?Antworten:
Windows hat damit überhaupt nichts zu tun. Sie könnten das gleiche genaue Verhalten mit einer lokalen Instanz von (sagen wir) GNOME - Terminal, mit entsprechend ausgewählten Terminal Codierung reproduzieren und entsprechend konfiguriert locale für
ls
, ohne Fenster im Bild sein überhaupt .Das einzige, was Windows tut, ist klar zu zeigen, was hier vor sich geht. Ihr Windows-FTP-Programm nimmt die Bytes in den Dateinamen und zeigt sie als relevante Codepunkte auf der Codepage 1252 an. Diese Einzelbyte-Codierung mit fast allem über 0x1F, einer druckbaren Glyphe, gibt genau an, wie die Bytes in Ihren Dateinamen lauten .
Ihr zweiter Dateiname ist weitgehend uninformativ, aber der erste und der dritte sind aussagekräftig.
63
61
66
c3
a9
2d
32
2e
70
6e
67
- In Codepage 1252 ist diescafé-2.png
. Es ist auch die UTF-8-Codierung voncafé-2.png
.63
61
66
e9
2e
70
6e
67
- In Codepage 1252 ist diescafé.png
. Es ist jedoch keine gültige UTF-8-Codierung.e9
beginnt eine unvollständige Zeichencodierungssequenz.Was also passiert, ist, dass die Dinge nicht die Codepage 1252 verwenden, sondern dass UTF-8 verwendet wird, nämlich Ihre SSH-Sitzung und Ihr lokaler Terminalemulator, die das gültige UTF-8 auf die gleiche Weise wie einander behandeln, aber behandeln das ungültige UTF-8 auf zwei verschiedene Arten:
é
greift auf Code zurück, wenn er auf eine ungültige Codierung stößt.Ihr zugrunde liegendes Problem ist ein System, das auf irgendeine Weise einige als UTF-8 codierte Dateinamen und andere in Code Seite 1252 codierte Dateinamen generiert.
quelle