readdir - Umlaute Problem

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

  • readdir - Umlaute Problem

    Hallo.

    Ich lese mit readdir() den Inhalt eines Verzeichnisses (Windows) ein, um einige Dateien und Verzeichnisse zu bearbeiten.

    Alles klappt wunderbar, bis auf einen bestimmten "Verzeichnis-Typ", der sich aufgrund eines Umlauts nicht fehlerfrei einlesen lässt.

    Zum Test habe ich selber einige Verzeichnisse mit Umlauten erstellt, die wiederum einwandfrei erkannt und dargestellt werden.

    Aber diese bestimmten Verzeichnisse müssen wohl irgendwie über Linux kommen oder sonstwas. Jedenfalls erhalte ich anstelle des Namens "[UNVOLLSTÄNDIG 48F von 49F]" den fehlerhaften Namen "[UNVOLLST-NDIG 48F von 49F]"

    Ich habe es mit urlencode(), urldecode(), rawurlencode(), rawurldecode() und auch UTF-8 versucht, doch ich bekomme nie den korrekten Verzeichnisnamen mit dem "Ä" angezeigt.

    Hat jemand eine Idee, woran es liegt bzw. wie ich den Verzeichnisnamen richtig darstellen kann, um bspw. mit "cd [verzeichnis]" in das Verzeichnis wechseln zu können?

    Falls es jemand ausprobieren möchte: Ich habe die Verzeichnisse in ein Archiv gepackt und hochgeladen: http://www.namelesshost.com/testverzeichnisse.rar
    (1 KB groß)

    Danke im Voraus.

    cya

  • #2
    Schon mal versucht, die Stelle mit einem Hexeditor zu untersuchen?
    Wir werden alle sterben

    Kommentar


    • #3
      Äh, nein. Wie soll ich das denn machen?

      cya

      Kommentar


      • #4
        PHP-Code:
        echo bin2hex($string); 
        http://php.net/manual/en/function.bin2hex.php

        Kommentar


        • #5
          Ach so.

          Okay, hexadezimal ist es "c4", was wiederum einem "Ä" entspricht.

          Aber wieso wird es dann nicht als "Ä" angezeigt bzw. wie generiere ich den korrekten String? Ich steh' im Moment völlig auf dem Schlauch.

          cya

          Kommentar


          • #6
            Welchen Zeichensatz hast du im HTTP- und HTML-Header gesetzt?

            Kommentar


            • #7
              Gar keinen. Ich erhalte den Verzeichnisnamen und verarbeite ihn. Zu Testzwecken habe ich ihn mit

              echo $dirdata;

              ausgegeben und auch in eine Datei geschrieben. Bei beiden stand statt dem "Ä" ein "-".

              cya

              Kommentar


              • #8
                Dann gib einen Zeichensatz im HTTP-Header an.

                Kommentar


                • #9
                  Und inwiefern hilft mir das dann?

                  Im eigentlichen Skript lese ich den Verzeichnisnamen ein und wechsel in dieses Verzeichnis, um die darin befindlichen Dateien einzlesen. Der Verzeichniswechsel schlägt jedoch fehl, weil der Verzeichnisnamen falsch ist.

                  Kommentar


                  • #10
                    Zitat von sallow2001 Beitrag anzeigen
                    Und inwiefern hilft mir das dann?
                    Dass man überhaupt mal die Ausgabe mit echo beurteilen kann. Ansonsten erhältst du ein Zufallsergebnis, also kannst du dir die Ausgabe mit echo gleich komplett sparen, und wie soll man da den Fehler suchen?

                    Außerdem wäre es interessant zu wissen, wie du das Verzeichnis wechselst. Vielleicht liegt ja der Fehler dort.
                    Zuletzt geändert von h3ll; 22.08.2011, 12:45.

                    Kommentar


                    • #11
                      Zitat von sallow2001 Beitrag anzeigen
                      Hallo.

                      Ich lese mit readdir() den Inhalt eines Verzeichnisses (Windows) ein, um einige Dateien und Verzeichnisse zu bearbeiten.

                      Alles klappt wunderbar, bis auf einen bestimmten "Verzeichnis-Typ", der sich aufgrund eines Umlauts nicht fehlerfrei einlesen lässt.

                      Zum Test habe ich selber einige Verzeichnisse mit Umlauten erstellt, die wiederum einwandfrei erkannt und dargestellt werden.

                      Aber diese bestimmten Verzeichnisse müssen wohl irgendwie über Linux kommen oder sonstwas. Jedenfalls erhalte ich anstelle des Namens "[UNVOLLSTÄNDIG 48F von 49F]" den fehlerhaften Namen "[UNVOLLST-NDIG 48F von 49F]" ...
                      Wie soll man "... müssen wohl irgendwie über Linux kommen ..." verstehen? Dein Script läuft unter Windows. Irgendwie fehlen hier wichtige Informationen. Rück sie raus, sonst kann dir keiner helfen.

                      Wie sieht dein Quelltext aus?

                      Hat jemand eine Idee, woran es liegt bzw. wie ich den Verzeichnisnamen richtig darstellen kann, um bspw. mit "cd [verzeichnis]" in das Verzeichnis wechseln zu können?
                      Unter PHP wechselt man mit chdir() das Arbeitsverzeichnis.

                      Falls es jemand ausprobieren möchte: Ich habe die Verzeichnisse in ein Archiv gepackt und hochgeladen: http://www.namelesshost.com/testverzeichnisse.rar ...
                      Entpackt und eingelesen. Keine Probleme gefunden.

                      PHP-Code:
                      $url 'x:/_test/verzeichnisse/Verzeichnis1/';
                      //$url = 'x:/_test/verzeichnisse/Verzeichnis2/';

                      $dir opendir($url); // oeffnen
                      chdir($url); // wechseln
                      while (is_string($entry readdir($dir))) { // einlesen
                          // kurzen und gesamten Pfad ausgeben
                          
                      error::writefln('$entry: %s :: %s'$entryrealpath($entry));
                      }
                      closedir($dir); // zu-machen 
                      Was das Darstellen der Umlaute betrifft: PHP kann unter Windows nur die "ANSI"-Funktionen benutzen. Unicode können die PHP-Helden bis heute nicht. Es werden also die Zeichen, die außerhalb des ASCII-Bereichs liegen, in der jeweils eingestellten Codepage angezeigt. Zeichen aus anderen Codepages werden durch ein Ersatzzeichen ("?") überschrieben, oder der entsprechende Verzeichniseintrag wird gar nicht erst gefunden (auch nicht über den Short-Path-Name-Hack).

                      Wenn dein Windows die "ANSI-Codepage" (Win-1252) benutzt, kannst du Pfade oder Verzeichniseinträge mit utf8_encode() ausgabetauglich umwandeln.
                      Zuletzt geändert von fireweasel; 22.08.2011, 14:33.
                      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                      Kommentar


                      • #12
                        Okay, ich dachte ich muss nicht so weit ausholen (man soll sich ja immer kurz fassen bei seinen Fragen ), aber dann muss es wohl sein, denn ich habe nun etwas entdeckt, was mich im Nachhinein noch mehr verwirrt.

                        Es geht um ein Skript, das sich ab einem Startverzeichnis durch die Unterverzeichnisse wühlt und dabei die Aktionen in eine BATCH-Datei schreibt.
                        Das Ergebnis würde in etwa so aussehen:

                        Code:
                        C:
                        cd \START
                        <mach etwas mit den Dateien>
                        cd Unterverzeichnis1
                        <mach etwas mit den Dateien>
                        cd ..
                        cd Unterverzeichnis2
                        <mach etwas mit den Dateien>
                        cd ..
                        cd Unterverzeichnis3
                        <mach etwas mit den Dateien>
                        cd ..
                        Und hierbei ergibt es sich, dass eines der besagten Unterverzeichnisse nicht als

                        Code:
                        cd TÄST
                        sondern als

                        Code:
                        cd T-ST
                        in die BATCH-Datei geschrieben wird, was natürlich zu einem Fehler führt, weil der Name falsch ist.

                        Woher die Verzeichnisse kommen, kann ich nicht sagen. Ich selber habe sie auch nicht. Der Fehler trat nur bei meinem Kollegen auf, der diese wohl aus irgendwelchen Download-Archiven mitentpackt hat.

                        Ich hatte nun angenommen, dass das Verzeichnis irgendwie falsch kodiert wurde oder sowas, so dass der Name nicht richtig gelesen werden konnte.

                        Nun hat sich aber ergeben, dass das Skript eigentlich alles richtig macht. Das Problem ergibt sich nämlich erst, nachdem ich die PHP-Datei in eine ausführbare Datei kompiliert (bamcompile) habe.
                        Das Skript ist nicht für mich, sondern für einen Kollegen und ich wollte vermeiden, dass er sich deshalb extra lokal einen Webserver installieren muss, um das Skript nutzen zu können.

                        Starte ich das Skript im Browser und gebe dort den Dateinamen aus, funktioniert es einwandfrei. (Auch ohne expliziter Angabe eines Zeichensatzes.)

                        Kompiliere ich jedoch die PHP und starte sie dann von der Kommandozeilenebene aus, kommt es zu dem besagten Umlaut-Fehler.

                        Ich hoffe, jetzt ist die Situation etwas klarer. Oder?

                        cya
                        Zuletzt geändert von sallow2001; 22.08.2011, 14:43.

                        Kommentar


                        • #13
                          Zitat von sallow2001 Beitrag anzeigen
                          Nun hat sich aber ergeben, dass das Skript eigentlich alles richtig macht. Das Problem ergibt sich nämlich erst, nachdem ich die PHP-Datei in eine ausführbare Datei kompiliert (bamcompile) habe.
                          Das Skript ist nicht für mich, sondern für einen Kollegen und ich wollte vermeiden, dass er sich deshalb extra lokal einen Webserver installieren muss, um das Skript nutzen zu können.
                          Man kann PHP-Scripte auch ohne Webserver ausführen. Im PHP-Verzeichnis gibts dazu eine Kommandozeilen-Version des Interpreters. Man muss dazu auch nicht irgendwelche File-Types registrieren, die Ausführung eines Scriptes lässt sich auch über eine Batch-Datei anstoßen.

                          Und wenn der Fehler erst durchs "Compilieren" zu Tage tritt, hast du ein Problem. Für Bambalams EXE-Compiler (letztes Update 2006) vernünftigen Support zu bekommen, war schon immer schwierig. Nebenbei läuft das Teil doch noch mit PHP 4. Da wenden sich einige sicher mit Grausen ab.
                          So, wie es aussieht, fummelt Bamcompile an den Stream-Funktionen von PHP herum. Die sind auch für Verzeichnisse zuständig.

                          Wenn das Script unbedingt als EXE-Datei vorliegen muss, weichst du besser auf eine andere Scriptsprache aus, die das besser kann. AutoIt wäre hier die erste Alternative. Die kann (fast) alles, was PHP kann, hat aber 100-prozentigen Unicode- und Windows-Support (auch 64 Bit).

                          Zitat von sallow2001 Beitrag anzeigen
                          Okay, ich dachte ich muss nicht so weit ausholen (man soll sich ja immer kurz fassen bei seinen Fragen ), ...
                          Kurz fassen ist ja okay, aber es sollten alle wesentliche Informationen dabei sein ... Sonst artet das in Raterei aus.


                          Es geht um ein Skript, das sich ab einem Startverzeichnis durch die Unterverzeichnisse wühlt und dabei die Aktionen in eine BATCH-Datei schreibt.
                          ...
                          Und hierbei ergibt es sich, dass eines der besagten Unterverzeichnisse nicht als

                          Code:
                          cd TÄST
                          sondern als

                          Code:
                          cd T-ST
                          in die BATCH-Datei geschrieben wird, ...

                          Woher die Verzeichnisse kommen, kann ich nicht sagen. Ich selber habe sie auch nicht. Der Fehler trat nur bei meinem Kollegen auf, der diese wohl aus irgendwelchen Download-Archiven mitentpackt hat.

                          Ich hatte nun angenommen, dass das Verzeichnis irgendwie falsch kodiert wurde oder sowas, so dass der Name nicht richtig gelesen werden konnte.
                          Wie schon gesagt: Ich tippe auf irgendeine fremde Codepage, in der die Namen der Verzeichniseinträge kodiert sind. Um die herauszubekommen, müsstest du sie mit einem Unicode-tauglichen Verzeichnis-Scanner einlesen.

                          Da es sich um Umlaute handelt, kann auch eine spezielle Unicode-Kodierung (Vokal + kombinierendes diakritisches Zeichen) die Ursache sein.

                          Starte ich das Skript im Browser und gebe dort den Dateinamen aus, funktioniert es einwandfrei. (Auch ohne expliziter Angabe eines Zeichensatzes.)
                          Der Browser benutzt ohne Vorgaben die Default-Kodierung (oder versucht zu raten). Die ist meist Win-1252 oder ISO-Latin-1, bei Umlauten macht das keinen Unterschied.
                          Zuletzt geändert von fireweasel; 27.10.2014, 12:34. Grund: Default-Codepage war Win-1252 nicht 1251
                          Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                          Kommentar


                          • #14
                            Zitat von fireweasel Beitrag anzeigen
                            Im PHP-Verzeichnis gibts dazu eine Kommandozeilen-Version des Interpreters.
                            Ja, aber wir wissen doch, wie Benutzer sind: Es soll einfach sein, alles können und zudem darf's nichts kosten.

                            Zitat von fireweasel Beitrag anzeigen
                            Wenn das Script unbedingt als EXE-Datei vorliegen muss, weichst du besser auf eine andere Scriptsprache aus,
                            Ich wollte schon bei PHP bleiben. Diese Kompilier-Geschichte ist eigentlich eine Ausnahme.

                            Aber interessant sieht's schon aus. Angucken werde ich mir AutoIt auf jeden Fall..

                            Zitat von fireweasel Beitrag anzeigen
                            Kurz fassen ist ja okay, aber es sollten alle wesentliche Informationen dabei sein ... Sonst artet das in Raterei aus.
                            Korrekt. Ich hatte halt angenommen, dass diese "Art" von Verzeichnisse eine fehlerhafte bzw. unbekannte Kodierung haben und deshalb nicht korrekt verarbeitet werden. Also hätte ein Konvertier-Aufruf reichen müssen und dazu wären meine Ausführungen (sogar inkl. Beispiel) ausreichend gewesen.

                            Zitat von fireweasel Beitrag anzeigen
                            Unicode-tauglichen Verzeichnis-Scanner einlesen.
                            Hast Du einen? Kannst Du einen empfehlen?

                            Noch eine andere Frage: Wenn ich mit bin2hex() ermitteln kann, dass das Zeichen "-" den Code "c4" hat, der wiederum für das "Ä" steht, gibt's denn dann keine Umkehrfunktion, die diesen HEX-Code zurückrechnen kann, so dass u.a. aus dem "c4" ein "Ä" wird?
                            Verständlich, was ich meine?

                            cya

                            Kommentar


                            • #15
                              Wie schreibst du denn in die Batch-Datei?

                              Kommentar

                              Lädt...
                              X