PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   readdir - Umlaute Problem (https://www.php-resource.de/forum/php-developer-forum/102065-readdir-umlaute-problem.html)

sallow2001 22-08-2011 09:05

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

combie 22-08-2011 09:53

Schon mal versucht, die Stelle mit einem Hexeditor zu untersuchen?

sallow2001 22-08-2011 10:38

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

cya

h3ll 22-08-2011 10:43

PHP-Code:

echo bin2hex($string); 

http://php.net/manual/en/function.bin2hex.php

sallow2001 22-08-2011 11:55

Ach so. http://www.namelesshost.com/vollkomm...smiley/doh.gif

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

h3ll 22-08-2011 12:06

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

sallow2001 22-08-2011 12:12

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

h3ll 22-08-2011 12:26

Dann gib einen Zeichensatz im HTTP-Header an.

sallow2001 22-08-2011 12:42

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.

h3ll 22-08-2011 12:43

Zitat:

Zitat von sallow2001 (Beitrag 655970)
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.

fireweasel 22-08-2011 14:25

Zitat:

Zitat von sallow2001 (Beitrag 655957)
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?

Zitat:

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.

Zitat:

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.

sallow2001 22-08-2011 14:39

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? :dontknow:

cya

fireweasel 22-08-2011 22:24

Zitat:

Zitat von sallow2001 (Beitrag 655977)
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:

Zitat von sallow2001 (Beitrag 655977)
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.

Zitat:


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.

Zitat:

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.

sallow2001 22-08-2011 22:45

Zitat:

Zitat von fireweasel (Beitrag 655978)
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:

Zitat von fireweasel (Beitrag 655978)
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:

Zitat von fireweasel (Beitrag 655978)
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:

Zitat von fireweasel (Beitrag 655978)
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

h3ll 22-08-2011 22:51

Wie schreibst du denn in die Batch-Datei?


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:27 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG