| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

22-08-2011, 09:05
|
|
sallow2001
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 63
|
|
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
|

22-08-2011, 09:53
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Schon mal versucht, die Stelle mit einem Hexeditor zu untersuchen?
|

22-08-2011, 10:38
|
|
sallow2001
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 63
|
|
Äh, nein. Wie soll ich das denn machen?
cya
|

22-08-2011, 10:43
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
|

22-08-2011, 11:55
|
|
sallow2001
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 63
|
|
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
|

22-08-2011, 12:06
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Welchen Zeichensatz hast du im HTTP- und HTML-Header gesetzt?
|

22-08-2011, 12:12
|
|
sallow2001
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 63
|
|
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
|

22-08-2011, 12:26
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Dann gib einen Zeichensatz im HTTP-Header an.
|

22-08-2011, 12:42
|
|
sallow2001
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 63
|
|
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.
|

22-08-2011, 12:43
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von sallow2001
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.
Geändert von h3ll (22-08-2011 um 12:45 Uhr)
|

22-08-2011, 14:25
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von sallow2001
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.
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', $entry, realpath($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.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (22-08-2011 um 14:33 Uhr)
|

22-08-2011, 14:39
|
|
sallow2001
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 63
|
|
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
sondern als
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
Geändert von sallow2001 (22-08-2011 um 14:43 Uhr)
|

22-08-2011, 22:24
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von sallow2001
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
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
sondern als
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-1251 oder ISO-Latin-1, bei Umlauten macht das keinen Unterschied.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|

22-08-2011, 22:45
|
|
sallow2001
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 63
|
|
Zitat:
Zitat von fireweasel
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
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
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
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
|

22-08-2011, 22:51
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Wie schreibst du denn in die Batch-Datei?
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|