Der Martin: Ursachenbekämpfung bei Dateinamen mit "äöü"

Beitrag lesen

Hallo,

Abgesehen davon: Meinst du wirklich _Datei_namen?
Ja ich meine Dateinamen. Ich lese mit einem PHP-Script Verzeichnisse und Dateien aus ...

okay, dieser Teil ist damit klar. Und er birgt schon den ersten Teil des Problems: Du weißt vermutlich nicht, in welcher Codierung Dateinamen auf deinem Server vorliegen.
Normalerweise würde ich da heutzutage UTF-8 erwarten. Muss aber nicht zwangsläufig so sein.

... und wandle sie für die Anzeige mit utf8_encode.

Dann solltest du aber sicher sein, dass sie nicht sowieso schon in UTF-8 vorliegen. Gib mal im PHP-Script probehalber einen der gefundenen Dateinamen mit Umlaut mit

echo urlencode($name);

aus. Achte darauf, ob für den Umlaut ein oder zwei Bytes angezeigt werden. Sind es zwei, hast du mit nahezu 100% Wahrscheinlichkeit UTF-8; ist es nur eins, dann ist es eine der gängigen Single-Byte-Codierungen, z.B. ISO-8859-1. Dann und nur dann ergibt die Umwandlung mit utf8_encode() einen Sinn, und natürlich auch nur, wenn das zum Client ausgelieferte Dokument insgesamt auch UTF8-codiert ist.

Wenn ich jedoch damit ein Adress-Element bilde, wird die Datei nicht gefunden. Ich müsste auf dem Client wieder zurückwandeln können, aber das scheint leider nicht einfach möglich zu sein.

Ich beginne so langsam, dein Problem zu verstehen. Glaube ich jedenfalls. ;-)
Und ich würde für den Lösungsansatz komplett von Javascript weggehen und die Geschichte rein serverseitig (z.B. in PHP) abfrühstücken.

Du musst zwei Dinge unterscheiden, wenn du Namen mit Nicht-ASCII-Zeichen verarbeitest. Die korrekte Anzeige beim Client, und die korrekte Codierung des Links (bzw. des src-Attributs, wenn es um Bilder geht), wenn daraus wieder ein Request an den Server werden soll.

Ersteres kannst du mit dem oben genannten Test leicht hinkriegen. Letzteres auch - in den URLs sollte schon gar kein Nicht-ASCII-Zeichen mehr auftauchen. Du solltest also im Script die gefundenen Namen erst mit utf8_encode() umwandeln, falls sie noch nicht UTF-8 sind. Das ergibt den String, der für die Anzeige verwendet wird. Um ihn in URLs einzusetzen, solltest du ihn dann noch mit urlencode() codieren:

$name = utf8_encode($filename);  
echo "<a href='" . urlencode($name) . "'>$name</a>";

Ich habe hier im Beispiel bewusst ein a-Element verwendet und kein img-Element, damit der Unterschied zwischen angezeigtem Namen und URL deutlicher wird.

Ich habe auch schon versucht, den Dateinamen als "iso" und "utf8" zu übergeben, aber das verträgt PHP nicht, wenn man das in einem String über den Operator "." macht.

Das verstehe ich nun wieder nicht.

Da es sich um jpg-Dateien handelt, könnte man zwar den echten Namen in den Tags unterbringen, nur wie liest man diese mit Javascript im Client wieder aus.

AFAIK hat Javascript keine Möglichkeit, auf diese Metainformationen in JPEG-Grafiken zuzugreifen.

So long,
 Martin

--
Auch mit eckigen Radios kann man Rundfunk hören.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(