PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP: Umlaute in Dateien per CLI in HTML-Entities umwandeln


Drexel
2005-07-18, 14:00:36
Hallo,

ich habe hier folgendes Problem: Ich habe hier HTML-Dateien, in denen Umlaute (ä,ü,ö) auch wirklich als Umlaute geschrieben sind und nicht als HTML-Entitiy (ä ü ö ). Das wollte ich jetzt jetzt mit einem kleinen PHP-Script über das CLI eben korrigieren (Ich weiss, dass PHP dafür evtl nicht die optimalste Sprache ist, aber es ist die einzige, die ich soweit behersche :) ). Das Script läuft unter Windows XP und sieht so aus:


<?php
function getEnding ($filename)
{
if (substr ($filename, 0, 1) == ".")
{
$filename = (substr ($filename, 1, strlen($filename)));
}
$endingcopy=$filename;
$ending = stristr ($filename, ".");
if ($ending != "")
{
$ending = getEnding ($ending);
}
else
{
$ending=$endingcopy;
}
return $ending;
}

$handle=opendir ("d:\\verzeichnis");
while ($file = readdir ($handle))
{
if ($file != "." && $file != "..")
{
$ending = getEnding($file);
if ($ending == "shtml")
{
$filehandlerread = fopen ("d:\\verzeichnis\\" . $file, "rb");
$filehandlerwrite = fopen ("d:\\verzeichnisneu\\" . $file, "ab");
while (!feof($filehandlerread))
{
$line = fgets ($filehandlerread);
echo $line . " -> ";
$line = str_replace ("ä", "&auml;", $line);
$line = str_replace ("ö", "&ouml;", $line);
$line = str_replace ("ü", "&uuml;", $line);
$line = str_replace ("Ä", "&Auml;", $line);
$line = str_replace ("Ö", "&Ouml;", $line);
$line = str_replace ("Ü", "&Uuml;", $line);
echo $line . "\n";
fputs ( $filehandlerwrite, $line);
}
fclose ($filehandlerread);
fclose ($filehandlerwrite);
}
}
}
closedir($handle);
?>


Die Funktion getEnding() liefert die Dateiendung der aktuellen Datei zurück, dann wird der Inhalt aller .shtml-Dateien zeilenweise eingelesen, die Umlaute sollten eigentlich ersetzt werden und die Dateien werden wieder zeilenweise in ein neues Verzeichnis geschrieben.

Das ganze funktioniert aber irgendwie wegen der Kodierung nicht, wenn ich mir die Ausgabe auf der Kommandozeile ansehe, werden statt ä ö ü auch andere grafische Zeichen ausgegeben und deswegen werden die Zeichen durch str_replace auch nicht gefunden.

Kann mir jemand sagen, wie ich dieses Problem lösen kann? Ich habe es schon über htmlentities() und recode_string() probiert, wobei die erste Funktion keine Lösung brachte und die zweite ein "call to undefined function" brachte.

Berni
2005-07-18, 14:12:44
Schau mal da: http://de3.php.net/readdir

/* This is the correct way to loop over the directory. */
while (false !== ($file = readdir($handle))) {
echo "$file\n";
}

/* This is the WRONG way to loop over the directory. */
while ($file = readdir($handle)) {
echo "$file\n";
}

Vielleicht liegts ja daran...wegen der Zeichencodierung ansonsten bin ich da leider auch ratlos, außer dass du mal versuchst, den "b-"Parameter bei fopen wegzulassen. Aber probiers mal mit "SonderZ 3.0" von http://www.wt-rate.com/ . Das ist Freeware und die enthaltene Option "Sonderzeichen in Dateien umwandeln" sollte genau für deinen Einsatzzweck sein!

Drexel
2005-07-18, 15:12:27
Also, das Programm wär schon ziemlich genau das, was ich suche, leider funktioniert das anscheinend nicht richtig.

Aus dem Wort für im Quelltext der HTML-Datei macht das Programm bei mir f&Atilde;&frac14;r was ja mal ziemlicher Quatsch ist.

Das mit dem durchlaufen des Verzeichnisses hat damit nichts zu tun, soweit ich mich richtig erinner, soll man das so machen, weil sonst ein Fehler auftreten, wenn eine Datei oder ein Ordner true oder false heisst. Aber ist schon richtig, man sollte es so machen.

Wird zeit, dass ich mir mal eine richtige OO-Programmiersprache aneigne... Naja kommt Studium, kommt rat ;)

Gast
2005-07-18, 15:39:55
In VB.NET gibts eine Funktion REPLACE() in die man einen String reinwerfen kann, wobei dann alle angegebenen vorkommenden Zeichen mit einer anderen Zeichenkette ersetzt werden.

Wäre eine Möglichkeit, das sehr schnell zu lösen ?!

Berni
2005-07-18, 16:27:47
Kannst du vielleicht mal eine dieser seltsamen SHTML-Seiten wo uploaden oder mir sonstwie zugänglich machen? Bei mir funktioniert das Programm nämlich einwandfrei also muss da irgendwas speziell sein in den Dateien von dir...

PatkIllA
2005-07-18, 16:41:06
Warum setzt du nicht das Characterencoding und lässt die Umlaute drin?

Drexel
2005-07-18, 17:01:21
@ Berni: www.kidde-deugra.com dann auf deutsch, die Seite die dann kommt, kannst Du nehmen.

@ PatkIllA: Wie meinst Du das? Kannst Du ein bißchen mehr ins Detail gehen, was ich tun müsste?

@Gast: Dafür müsste ich VB.NET haben/können.

PatkIllA
2005-07-18, 19:49:35
http://de.selfhtml.org/html/kopfdaten/meta.htm#zeichensatz
das in die Datei aufnehmen (das muss sowieso drin stehen für valides HTML) oder per PHP im Header den Zeichensatz festlegen.

Berni
2005-07-19, 00:03:43
Also soweit ich das sehe steht der Zeichensatz UTF-8 ja soundso schon in den Headern der HTML-Dateien drin. Von daher ist ne Konvertierung der Sonderzeichen eigtl. wirklich unnötig.
Das UTF-8 ist auch schuld, wieso die ganzen Konvertierungssachen nicht funktionieren; die gehen nämlich alle davon aus, dass die Textdateien im ASCII-Format vorliegen und nicht schon in UTF-8. Wenn du mal mit Ultraedit eine Datei als ASCII abspeicherst (Datei=>Konvertieren=>UTF8 nach ASCII), dann funktioniert wohl sowohl dein Skript als auch das Konverterprogramm...
Du könntest auch mal noch mit "gnu recode" ausprobieren. Vielleicht klappt damit ja die Konvertierung zu ASCII oder gleich mit HTML entities...
Im PHP könntest dus mal versuchen mit ner Konvertierung mittels iconv bevor deinen Replacements:
line=iconv("UTF-8", "ISO-8859-1", line);
Alternativ kannst dus auch mal mit utf8_decode() versuchen:
line=utf8_decode(line);

mithrandir
2005-07-19, 08:01:36
Dere!

Ist vielleicht OT, aber ich mache so etwas mit jEdit (Freeware). Dort gibt es eine Option, Zeichenketten in sämtlichen Dateien eines Verzeichnisses zu ersetzen. Das funktioniert einwandfrei, kostenlos und ohne Aufwand.

bye, mith

Drexel
2005-07-19, 08:15:12
Tja, aber wenn ich die Seite komplett auf einem anderen Webserver laufen lasse, werden die Sonderzeichen nicht richtig dargestellt...

Drexel
2005-07-19, 09:05:15
Oh Mann, ich hätte mir den kompletten Ärger gestern sparen können, wenn ich einfach mal das default Charset des Webservers von ISO-8859-1 auf UTF-8 umgestellt hätte.


Beachten Sie:

Im Konfliktfall, also wenn der Webserver im HTTP-Header eine hiervon abweichende Angabe sendet, wird üblicherweise die Angabe des HTTP-Headers verwendet.


Das war nämlich das Problem. Jetzt klappt es einwandfrei. Danke für Eure Hilfe! Wobei ich mich frage, warum man es in den Dateien überhaupt angibt, wenn eh das genommen wird, was vom Webserver gesendet wird.

Mich würde aber trotzdem interessieren, ob man das mit dem Script irgendwie hinbekommen kann :).