Warum sehen meine Dateinamen unter Linux "normal" aus, unter Windows jedoch nicht remote?

10

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.gifoder 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 shadein 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-8ist 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.

Bram Vanroy
quelle
1
Dies ist eine Frage des Clients (PuTTY usw.) und seiner Konfiguration und für Windows nicht relevant. Für PuTTY erfolgt dies im Übersetzungsbereich .
Thomas Dickey
2
Es sieht so aus, als ob das é in "café-2.png" UTF-8-codiert ist, aber das é in "café.png" ist ISO-8859-1-codiert. Kannst du rennen python -c "import sys; print(repr(sys.argv[1]))" café-2.pngund python -c "import sys; print(repr(sys.argv[1]))" café.png?
Oskar Skog
@OskarSkog Ich werde das am Morgen versuchen. Aber ich habe immer gedacht, dass Dateinamen keine Codierung haben, mit anderen Worten: Es ist so, wie es das Betriebssystem will. Würde das bedeuten, dass die verschiedenen Dateien auf verschiedenen Betriebssystemen erstellt wurden? (Wir haben keine Kontrolle über die Herkunft der Dateien.)
Bram Vanroy
Unter Unix-ähnlichen Betriebssystemen ist der Dateiname nur eine Folge von Bytes. Das Konzept der Charaktere kommt auf eine höhere Ebene.
Oskar Skog
1
Nicht einmal in der Nähe einer Antwort oder einer Lösung, sondern nur ein Gedanke auf dem Weg, den man verfolgen sollte. Aus dem OP geht hervor, dass die Dateien möglicherweise unterschiedliche Ursprünge haben und keine Kontrolle über den von der Quelle generierten Namen haben. Es ist zu spät, Filter anzuwenden, um den eingehenden Dateinamen snafus zu korrigieren. Die Lösung besteht wahrscheinlich darin, ein Skript auf dem Server auszuführen, das Dateinamenfehler erkennen und korrigieren und möglicherweise sogar den für Namen verwendeten Zeichensatz / die Codepage standardisieren kann. Dann kann das OP dieselbe Codepage in Filezilla oder einem anderen Client verwenden, und die Dinge werden funktionieren. Über meine Fähigkeiten hinaus, aber vielleicht ein Hinweis, dem ich folgen muss.
user207673

Antworten:

11

Aber hier kommt Windows!

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.

  • Der erste Dateiname ist die Bytesequenz 63 61 66 c3 a9 2d 32 2e 70 6e 67- In Codepage 1252 ist dies café-2.png. Es ist auch die UTF-8-Codierung von café-2.png.
  • Der dritte Dateiname ist die Bytesequenz 63 61 66 e9 2e 70 6e 67- In Codepage 1252 ist dies café.png. Es ist jedoch keine gültige UTF-8-Codierung. e9beginnt 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:

  • Derjenige, der die Blockgrafik anzeigt, verwendet sehr wahrscheinlich einfach diese Blockgrafik als allgemeines Ersatzausgabezeichen für ungültige UTF-8-Sequenzen.
  • Derjenige, der den Buchstaben anzeigt, é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.

JdeBP
quelle
Ich bin nicht der Meinung, dass Windows damit nichts zu tun hat. Es würde wahrscheinlich nicht unter anderen Linux passieren. Das Problem ist die Standardcodierung, und afaik Windows hat (oder hatte zumindest) seinen CP und nicht UTF verwendet, was dazu führte, dass dieses Problem sogar auf demselben Betriebssystem in verschiedenen Ländern auftrat. Sie können dies unter Linux reproduzieren, aber Linux ist konsequenter bei der Auswahl von Unicode
MatthewRock
Hallo! Danke für die ausführliche Antwort. Sie konzentrieren sich auf das, was passiert, was schön ist: Ich verstehe immer gerne, was passiert. Aber könnten Sie vielleicht ein Licht darauf werfen, warum dies geschieht und wie wir den Problemen begegnen können, die sich aus dieser Inkonsistenz ergeben? Ich habe zwei Absätze hinzugefügt, um zu verdeutlichen, was ich meine.
Bram Vanroy
Ich frage mich, warum beide "Cafés" als gleich angezeigt werden, wenn sie es nicht sind. Hat GNUs ls (1) eine lächerliche Behandlung von Codierungsfehlern?
Oskar Skog
@MatthewRock In diesem Fall hat Windows meiner Meinung nach wirklich nichts damit zu tun. Ich bin mit den meisten Aktivitäten von M $ nicht zufrieden und gebe bereitwillig viele seiner Übel zu, aber ich kann keine Schuld sehen, wenn keine fällig ist. Wie die Antwort deutlich macht, liegt das Problem bei den Bytewerten der Namen selbst. In diesem Fall hat Windows das Symptom aufgedeckt, ist aber nicht das Problem. Nicht mehr als das Thermometer ist das Problem, wenn es zeigt, dass Ihr Fieber 104 ° beträgt. Das Problem entsteht durch alle Prozesse, die die Namen auf dem Server erstellt haben, auf dem sich die Dateien befinden, auf die das OP zugreifen möchte.
user207673
Könnten Sie weitere Informationen und mögliche Lösungen bereitstellen? Ansonsten habe ich mein Kopfgeld für nichts ausgegeben.
Bram Vanroy