php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


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! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack (1) Themen-Optionen Bewertung: Bewertung: 2 Stimmen, 5,00 durchschnittlich.
  1 links from elsewhere to this Post. Click to view. #1 (permalink)  
Alt 22-08-2011, 09:05
sallow2001
 Registrierter Benutzer
Links : Onlinestatus : sallow2001 ist offline
Registriert seit: Oct 2010
Beiträge: 103
sallow2001 ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 22-08-2011, 09:53
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Schon mal versucht, die Stelle mit einem Hexeditor zu untersuchen?
__________________
Wir werden alle sterben
Mit Zitat antworten
  #3 (permalink)  
Alt 22-08-2011, 10:38
sallow2001
 Registrierter Benutzer
Links : Onlinestatus : sallow2001 ist offline
Registriert seit: Oct 2010
Beiträge: 103
sallow2001 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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

cya
Mit Zitat antworten
  #4 (permalink)  
Alt 22-08-2011, 10:43
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
echo bin2hex($string); 
http://php.net/manual/en/function.bin2hex.php
Mit Zitat antworten
  #5 (permalink)  
Alt 22-08-2011, 11:55
sallow2001
 Registrierter Benutzer
Links : Onlinestatus : sallow2001 ist offline
Registriert seit: Oct 2010
Beiträge: 103
sallow2001 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #6 (permalink)  
Alt 22-08-2011, 12:06
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Welchen Zeichensatz hast du im HTTP- und HTML-Header gesetzt?
Mit Zitat antworten
  #7 (permalink)  
Alt 22-08-2011, 12:12
sallow2001
 Registrierter Benutzer
Links : Onlinestatus : sallow2001 ist offline
Registriert seit: Oct 2010
Beiträge: 103
sallow2001 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #8 (permalink)  
Alt 22-08-2011, 12:26
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Dann gib einen Zeichensatz im HTTP-Header an.
Mit Zitat antworten
  #9 (permalink)  
Alt 22-08-2011, 12:42
sallow2001
 Registrierter Benutzer
Links : Onlinestatus : sallow2001 ist offline
Registriert seit: Oct 2010
Beiträge: 103
sallow2001 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #10 (permalink)  
Alt 22-08-2011, 12:43
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.

Geändert von h3ll (22-08-2011 um 12:45 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 22-08-2011, 14:25
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

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

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.

Geändert von fireweasel (22-08-2011 um 14:33 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 22-08-2011, 14:39
sallow2001
 Registrierter Benutzer
Links : Onlinestatus : sallow2001 ist offline
Registriert seit: Oct 2010
Beiträge: 103
sallow2001 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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

Geändert von sallow2001 (22-08-2011 um 14:43 Uhr)
Mit Zitat antworten
  #13 (permalink)  
Alt 22-08-2011, 22:24
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
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:
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.

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.

Geändert von fireweasel (27-10-2014 um 12:34 Uhr) Grund: Default-Codepage war Win-1252 nicht 1251
Mit Zitat antworten
  #14 (permalink)  
Alt 22-08-2011, 22:45
sallow2001
 Registrierter Benutzer
Links : Onlinestatus : sallow2001 ist offline
Registriert seit: Oct 2010
Beiträge: 103
sallow2001 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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:
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:
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:
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
Mit Zitat antworten
  #15 (permalink)  
Alt 22-08-2011, 22:51
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Wie schreibst du denn in die Batch-Datei?
Mit Zitat antworten
Antwort

Lesezeichen


LinkBacks (?)
LinkBack to this Thread: https://www.php-resource.de/forum/php-developer-forum/102065-readdir-umlaute-problem.html
Erstellt von For Type Datum
Php ordner mit sonderzeichen - 1Q5A This thread Refback 04-08-2014 17:44

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem mit readdir() raffiausgoslar PHP Developer Forum 4 30-06-2010 01:09
Umlaute in der Datenbank - Problem Seikilos SQL / Datenbanken 3 09-07-2005 12:29
xml/xsl problem -> umlaute ceverlante XML 4 24-04-2005 13:13
Readdir - Bilder sortier Problem Der.Werner Projekthilfe 16 11-01-2005 00:21
problem mit string readdir(int dir_handle) und include eric_cartman_19 PHP Developer Forum 19 06-10-2003 16:14

Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:56 Uhr.