Bild laden aus UniCode-Dateinamen - Wie?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Bild laden aus UniCode-Dateinamen - Wie?

    Hallo Wissende,

    ich habe eine kleine Datenbank in der jede Mende Athleten eingetragen sind.

    Ich generiere aus der ID, dem Vornamen und dem Familiennamen des Eintrages einen Dateinamen, der dann so heissen könnte:

    8204_Łukasz_Trałka.png

    Wie ihr seht befinden sich in dem Dateinamen UniCode-Zeichen. Diese Datei befindet sich auf meinem Laptop und auf meinem Server. Unter Windows ist es kein Problem die Dateien anzuzeigen. Aber irgendwie geht das nicht auf meinem Server.

    Hier mal mein Code, wie ich es probier:

    PHP-Code:
            while($row mysql_fetch_object($ergebnis))
            {
                
    $i ++;
                if   (!(
    $i 2)){ $myclass ' class="one"';}
                else            { 
    $myclass ' class="two"';}
                if (
    $row->nr 127) {
                    echo(
    " <tr".$myclass." valign=\"top\">\n");
                    
    $fname trim($row->first_name);
                    
    $sname trim($row->second_name);
                    
    $nname trim($row->nick_name);
                  if (
    $nname <> '') {
                      
    $sfile $row->id.'_'.$nname.'.png';
                      if (
    file_exists('pics/players/'.$sfile)) {
                          echo(
    '<td>'.$row->nr.'</td><td>'.$fname.'</td><td>'.$sname.'</td><td>'.$nname.'</td><td>'.
    $row->id.'_'.$nname.'.png'.'</td><td><img src="pics/players/'.$sfile.'" title="'.$sfile.'"></td>');
                          }
                      else {
                          echo(
    '<td>'.$row->nr.'</td><td>'.$fname.'</td><td>'.$sname.'</td><td>'.$nname.'</td><td>'.
    $row->id.'_'.$nname.'.png'.'</td><td>'.$sfile.' not found!</td>');
                      }
                  }
                  else {
                      
    $sfile $row->id.'_'.$fname.'_'.$sname.'.png';
                      if (
    file_exists('pics/players/'.$sfile)) {
                          echo(
    '<td>'.$row->nr.'</td><td>'.$fname.'</td><td>'.$sname.'</td><td>'.$nname.'</td><td>'.
    $row->id.'_'.$fname.'_'.$sname.'.png'.'</td><td><img src="pics/players/'.$row->id.'_'.$fname.'_'.$sname.'.png" title="'.$row->id.'_'.$fname.'_'.$sname.'.png"></td>');
                          }
                      else {
                          echo(
    '<td>'.$row->nr.'</td><td>'.$fname.'</td><td>'.$sname.'</td><td>'.$nname.'</td><td>'.
    $row->id.'_'.$fname.'_'.$sname.'.png'.'</td><td>'.$sfile.' not found!</td>');
                      }
                  }
                echo(
    " </tr>\n");
                }
            } 
    Bilder, die keine Sonderzeichen beinhalten werden korrekt angezeigt.
    Ich würde mich freuen, wenn ihr mir eine helfende Hand reicht.
    Zuletzt geändert von torud; 22.02.2012, 10:01.
    Danke
    Tom

  • #2
    Hallo,

    bitte brich den Code nach spätestens 80 Zeichen um (Beitrag bearbeiten), damit man nicht horizontal scrollen muss.

    Unter Windows werden Dateinamen im entsprechenden Windows-Zeichensatz der jeweiligen Sprachversion abgelegt (z. B. windows-1250). Ein Linux/Unix-basierter Server arbeitet mit einem anderen Zeichensatz (soweit ich weiß meist UTF-8).

    Damit der Server deine mit Windows erstellten Dateien lesen kann, müsstest du die Dateinamen konvertieren, was aber dennoch keine sinnvolle Lösung ist.

    Variante 1: Speichere die Namen in der Datenbank und benutze als Dateiname den Primärschlüsselwert. Somit kann PHP jederzeit zu einem Namen den zugehörigen Dateinamen abfragen oder aus dem Dateinamen den Datensatz abholen.

    Variante 2: Gestalte die Dateinamen so, dass sie keine Sonderzeichen mehr enthalten und auf jedem Betriebssystem gleichermaßen behandelt werden können. Das ginge z. B. mit quoted-printable, was immer noch halbwegs menschenlesbar ist.

    Variante 3: Eine Hybridlösung aus den vorherigen: Jeder Dateiname beginnt mit dem Primärschlüsselwert und enthält zusätzlich eine halbwegs lesbare, codierte Repräsentation des Namens, z. B. 8204_=c5=81ukasz_Tra=c5=82ka oder 8204-#0141ukasz-Tra#0142ka. So kannst du jederzeit aus dem Dateinamen den Namen der Person rekonstruieren und über die ID zusätzlich den gesamten Datensatz abrufen.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Hallo Amica,

      ich habe inzwischen herausgefunden, dass das Problem nicht ausschließich in den Dateinamen liegt, sondern schon mit einem php-Bug in der function file_exists seine Begründung findet.

      Lasse ich nämlich diese Prüfung weg, funktioniert es wunderbar.
      So habe ich es jetzt erstmal gemacht. Blöd nur, dass nun keinerlei Prüfung vornehmen kann und keinen Report erstellen kann.

      Ich habe leider inzwischen fast 500 Bilder erstellt. Da fällt einem das Umschwenken zu anderen Dateinamen schon schwerer...
      Danke
      Tom

      Kommentar


      • #4
        Zitat von torud Beitrag anzeigen
        Hallo Amica,

        ich habe inzwischen herausgefunden, dass das Problem nicht ausschließich in den Dateinamen liegt, sondern schon mit einem php-Bug in der function file_exists seine Begründung findet.
        File_exists() ist eine Dateisystem-Funktion. Und sie findet die angesprochene Datei dann nicht, wenn ihr Name Zeichen enthält, die nicht vom Dateisystem unterstützt werden. Alle PHP-Dateifunktionen können unter Windows nur die Dateien (oder Verzeichnisse) sehen, deren Namen ausschließlich aus Zeichen der eingestellten Codepage bestehen. Das ist hierzulande normalerweise Windows-1252 -- eine Art ISO-8859-1(5) mit ein paar zusätzlichen Zeichen. Alle anderen Dateinamen versteckt das alte Windows-API wohlweislich. Sie lassen sich auch nicht über den Short-Name-Hack (wie bspw. "DAT~1.TXT") ansprechen.

        Die einzige Möglichkeit, Unicode-Pfade zu referenzieren ist über die COM-API und das dort standardmäßig vorhandene "Scripting.FilesystemObject". Leider kennt dieses Objekt kein File-Locking, so dass Schreibzugriffe auf Dateien hier zu einem Vabanque-Spiel werden. Kombinierter Lese-und-Schreibzugriff ist auch nicht möglich. Ausschließlich Lesen funktioniert aber.

        Je nach Konfiguration des Systems kann man auch das ADODB.Stream-Objekt nutzen. Nur ist das nicht überall vorhanden und wenn, dann oft in unterschiedlichen Versionen mit unterschiedlichen API-Fähigkeiten.

        Ich habe leider inzwischen fast 500 Bilder erstellt. Da fällt einem das Umschwenken zu anderen Dateinamen schon schwerer...
        So lange die Dateisystem-Funktionen von PHP diese (schon lange) veraltete Windows-Schnittstelle nutzen, musst du entweder alle Dateinamen irgendwie kodieren oder dir einen entsprechenden Wrapper (jeweils um die Standard-Funktionen für Linux und um die COM-Funktionen für Windows) bauen, wenn dein Script auf beiden Betriebssystem-Familien gleich funktionieren soll.
        Zuletzt geändert von fireweasel; 25.02.2012, 12:13.
        Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

        Kommentar


        • #5
          Dateinamen mit Sonderzeichen sind zu vermeiden, weil sie immer wieder zu Problemen führen.

          Warum muss der Vor- und Nachname im Dateinamen vorkommen? Die ID alleine reicht doch vollkommen.

          Kommentar


          • #6
            Zitat von h3ll Beitrag anzeigen
            Dateinamen mit Sonderzeichen sind zu vermeiden, weil sie immer wieder zu Problemen führen.
            Nur, weil du in der Schule diese Buchstaben nicht gelernt hast, sind das keine Sonderzeichen.

            Im Übrigen ist eine pauschale Begrenzung auf ein ASCII-Subset möglicherweise bei 60-er-Jahre-Retro-Unix-Kommandozeilen-Fetischisten Usus. Wir haben aber 2012 und Unicode ist nichts Neuartiges mehr, sondern ein Standard, der schon Jahrzehnte existiert. Jedes halbwegs fähige Dateisystem (sogar FAT) unterstützt Unicode. Der Fehler liegt in der PHP-Implementierung der Dateisystemfunktionen.

            In Anlehnung an dein Motto müsste man daher eher die Anwendung von PHP vermeiden, weil dessen kaputte Dateisystemfunktionen immer wieder zu Problemen führen.

            Ein viel wichtigeres Problem ist die Unterscheidung (oder Nicht-Unterscheidung) von Groß- und Kleinschreibung, die von System zu System unterschiedlich gelöst ist. Und die ist unabhängig von Unicode.

            Warum muss der Vor- und Nachname im Dateinamen vorkommen? Die ID alleine reicht doch vollkommen.
            Da bin ich ganz deiner Meinung.
            Das wurde auch schon vorgeschlagen (Variante 1).
            Zuletzt geändert von fireweasel; 25.02.2012, 12:32.
            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

            Kommentar


            • #7
              Zitat von fireweasel Beitrag anzeigen
              Nur, weil du in der Schule diese Buchstaben nicht gelernt hast, sind das keine Sonderzeichen.
              Natürlich sind sie das. Genauso wie ä, ö und ü Sonderzeichen sind.

              Zitat von fireweasel Beitrag anzeigen
              Im Übrigen ist eine pauschale Begrenzung auf ein ASCII-Subset möglicherweise bei 60-er-Jahre-Retro-Unix-Kommandozeilen-Fetischisten Usus. Wir haben aber 2012 und Unicode ist nichts Neuartiges mehr, sondern ein Standard, der schon Jahrzehnte existiert. Jedes halbwegs fähige Dateisystem (sogar FAT) unterstützt Unicode. Der Fehler liegt in der PHP-Implementierung der Dateisystemfunktionen.
              In der schönen, heilen Welt...

              In der Praxis wirst du aber immer wieder mal auf Komponenten treffen, die Probleme damit haben. Mit ASCII bist du auf jeden Fall sicher. Außerdem gibts in 99,99% der Fälle keinen Grund Sonderzeichen in Dateinamen zu speichern. Warum also unnötig die Warhscheinlichkeit erhöhen damit auf Probleme zu stoßen? Nur weil mans kann? Tolle Begründung...

              Zitat von fireweasel Beitrag anzeigen
              In Anlehnung an dein Motto müsste man daher eher die Anwendung von PHP vermeiden, weil dessen kaputte Dateisystemfunktionen immer wieder zu Problemen führen.
              Es gibt viele Gründe, warum man PHP meiden sollte. Aber es gibt auch viele Gründe, die für PHP sprechen. Man muss eben abwägen. Und warum sich diese Auswahl durch Sonderzeichen in Dateinamen künstlich einschränken? Bringt doch nix.

              Zitat von fireweasel Beitrag anzeigen
              Ein viel wichtigeres Problem ist die Unterscheidung (oder Nicht-Unterscheidung) von Groß- und Kleinschreibung, die von System zu System unterschiedlich gelöst ist. Und die ist unabhängig von Unicode.
              Das ist auch ein Problem, das man aber relativ einfach in den Griff bekommt (_immer_ lowercase oder uppercase verwenden und niemals mischen).

              Kommentar


              • #8
                Zitat von h3ll Beitrag anzeigen
                Man muss eben abwägen. Und warum sich diese Auswahl durch Sonderzeichen in Dateinamen künstlich einschränken? Bringt doch nix.
                Es gibt sicher eine Menge (auch weniger sinnvoller) Sonderzeichen im Unicode-Set. Aber Umlaute und Buchstaben anderer Sprachen gehören trotzdem nicht dazu. Sie sind einfach nur Buchstaben.

                Python und Perl (nur als Beispiel) haben keine Schwierigkeiten betriebssystem-übergreifend Dateinamen, die Unicode außerhalb des von dir präferierten ASCII-Subsets enthalten, zu speichern und zu lesen. Nur die Windows-Version von PHP hat diese Probleme.

                Es sollte auch nicht die Aufgabe eines Anwendungsentwicklers sein, um die (offensichtlichen) Fehler in der Laufzeitumgebung herumzuprogrammieren.

                Zitat von h3ll Beitrag anzeigen
                Das ist auch ein Problem, das man aber relativ einfach in den Griff bekommt (_immer_ lowercase oder uppercase verwenden und niemals mischen).
                Der Threaderöffner wollte Namen speichern. Guckst du bspw. mal: Van Houten - Wikipedia, the free encyclopedia.
                Wie willst du die Namen zweier Menschen gleichen Vornamens aber mit "van Houten" und "Van Houten" als "Nachnamen" mit Konvertierung nach lower- oder uppercase eindeutig speichern?
                Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                Kommentar


                • #9
                  Zitat von fireweasel Beitrag anzeigen
                  Es gibt sicher eine Menge (auch weniger sinnvoller) Sonderzeichen im Unicode-Set. Aber Umlaute und Buchstaben anderer Sprachen gehören trotzdem nicht dazu. Sie sind einfach nur Buchstaben.
                  Ansichtssache. Und nur weil du es anders nennst als ich, ändert das nicht den Sinn meiner Aussage.

                  Zitat von fireweasel Beitrag anzeigen
                  Der Threaderöffner wollte Namen speichern. Guckst du bspw. mal: Van Houten - Wikipedia, the free encyclopedia.
                  Wie willst du die Namen zweier Menschen gleichen Vornamens aber mit "van Houten" und "Van Houten" als "Nachnamen" mit Konvertierung nach lower- oder uppercase eindeutig speichern?
                  Indem man eine ID als Dateiname verwendet und nicht den Namen selber. Die Applikation hat nichts davon, wenn die Dateien "schön" heißen. Außerdem hast du das selbe Problem, wenn zwei Personen wirklich komplett gleich heißen. Was machst du dann?

                  Kommentar


                  • #10
                    Zitat von fireweasel Beitrag anzeigen
                    Wie willst du die Namen zweier Menschen gleichen Vornamens aber mit "van Houten" und "Van Houten" als "Nachnamen" mit Konvertierung nach lower- oder uppercase eindeutig speichern?
                    Nichts gegen dich, aber dieses Beispiel finde ich sinnlos. Es ist offensichtlich, dass es zwei regional geprägte Schreibweisen mit identischer Bedeutung sind. Die Niederländer schreiben es klein (so wie wir unser „von“) und US-Amerikaner schreiben meist alle Namensbestandteile mit großem Anfangsbuchstaben (siehe Stolpersteine: häufig verwechselte Wörter - Lutz Walther - Google Bücher). Zwischen diesen Versionen gibt es aber keine semantischen Unterschiede und die kleingeschriebene Variante ist auch im American English genauso richtig wie die große. Ansonsten hat h3ll ja schon alles gesagt.
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar

                    Lädt...
                    X