phpbar.de logo

Mailinglisten-Archive

[php] fwrite

[php] fwrite

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Mon Jan 16 09:26:34 CET 2006


Hallo Werner,

Am Montag, 16. Januar 2006 01:35 schrieb Werner Laude:
> Am 16.01.2006 01:03   erhielt ich diese mail von Norbert Pfeiffer:
> $newfile_ ="öüäabc";
> $fp = fopen ($path."0.$filetype","w");
> 	  fputs ($fp,$newfile);
> 	  fclose ($fp);
>
> Kommt tatsächlich so in der 0.txt an..

$newfile_ und $newfile ist nur ein Tipfehler in der Mail, oder? :-) Also wenn 
Du $newfile direkt mit "öüäabc" befüllst, funktioniert es. Das bedeutet, daß 
der Zeichensatz, den Dein Editor verwendet, der Zeichensatz, mit dem die 
Datei, in der obiger Quelltext steht, und der Zeichensatz, mit dem die Datei 
0.txt abgespeichert ist, identisch sind. Ich tippe also mal auf ISO-8859-1 
bzw. ISO-8859-15. ;-)


> Ich beziehe die Daten von einem längeren script, welches die db
> ausliest. Wenn ich den output per
> echo $newfile = export_database("usr_web1_1");
> auf den Browser kippe
> sieht man u.a.
>
> INSERT INTO test ( id, text )
> 	VALUES ( 1, "öööüüävfgdfgdf" );
> INSERT INTO test ( id, text )
> 	VALUES ( 2, "gfgdfgdfßßßßääöö" );

Jetzt wird es interessant. ;-) Welchen Zeichensatz hat denn Dein Browser für 
das korrekte Anzeigen des MySQL-Dumps automatisch ausgewählt?!? Das wäre 
jetzt entscheidend zu wissen. Vermutlich wird das nicht ISO-8859-1 bzw. 
ISO-8859-15. Also UTF-8?


> Wenn ich dann $newfile in die Datei schreiben will, keine Umlaute mehr

Also wie Norbert schon sagte, ein Zeichensatz-Problem. Ich sehe da 
verschiedene Ansatzpunkte. Voraussetzung wäre aber, genau zu wissen, wo 
welcher Datensatz vorliegt. Ich gehe jetzt mal von folgendem aus:

	1. Du verwendest überall (Editor, Dateien, MySQL-Datenbank, Apache-Server) 
standardmäßig  ISO-8859-1 bzw. ISO-8859-15.
	2. Dein MySQL-Dump ist aber UTF-8.


Erster Ansatzpunkt: Der Export MySQL-Dump.
Ich kenne jetzt Deine Datenbankversion (UTF-8-Unterstützung?) nicht, aber 
grundsätzlich ist es so - das habe ich herausgefunden, als ich meine Website 
letzte Woche auf UTF-8 umgestellt habe -, daß Du an drei, vier Stellen an den 
verwendeten Zeichensatz denken mußt:

	1. Die Datenbank selbst hat einen Zeichensatz
	2. Die Datenbanktabelle hat einen Zeichensatz,
	    ebenso die Textspalten in der Tabelle
	3. Die Datenbankverbindung hat ebenfalls einen Zeichensatz!

Knackpunkt könnte also Punkt 3 sein. Versuche mal, den Zeichensatz für die 
Datenbankverbindung unmittelbar vor dem Dump-Befehl explizit zu setzen:

	SET CHARACTER SET latin1';


Zweiter Ansatzpunkt: Zeichensatzkonvertierung durch PHP.
Z.B. mit iconv (-> http://de2.php.net/manual/de/function.iconv.php) oder 
mb_convert_encoding 
(http://de2.php.net/manual/de/function.mb-convert-encoding.php) wandelst Du 
Deinen Dump von UTF-8 in ISO-8859-15 um. Beispiel für iconv:

 	$newfile = inconv('UTF-8', 'ISO-8859-1', $newfile);
bzw.
 	$newfile = inconv('UTF-8', 'ISO-8859-15', $newfile);

Achtung: iconv und mbstring sind nicht standardmäßig installiert. Du mußt also 
prüfen, ob die, die Du nutzen willst, bei Dir auch verfügbar ist.


Dritter Ansatzpunkt: Der vom Apache verwendete Zeichensatz.
Wenn Dein MySQL-Dump UTF-8 ist und PHP dann versucht, UTF-8 in die 
name.sql-/0.txt-Datei zu schreiben, dann könnte es sein, daß der 
Apache-Server hier eine Streich spielt, weil er eine Datei mit dem 
Zeichensatz ISO-8859-1 anlegt und speichert. Stichwort ist hier die Direktive 
AddDefaultCharset:

	http://httpd.apache.org/docs/2.0/mod/core.html#adddefaultcharset

Du könntest Deine name.sql-/0.txt-Datei ja in ein eigenes Unterverzeichnis 
schreiben und in diesem Verzeichnis dann eine .htaccess-Datei anlegen, die 
für dieses Verzeichnis serverseitig den Zeichensatz UTF-8 festlegt:

	<Directory "/dein_verzeichnis/">
		 AddDefaultCharset utf-8
	</Directory>

Das macht aber nur Sinn, wenn Du dann wirklich hinten UTF-8 raushaben 
willst... ;-) Das scheint ja bei Dir eher nicht der Fall zu sein. Also wird 
dieser Punkt eher nicht in Frage kommen, außer Du willst auch das mal 
ausprobieren. :-)


So, ich hoffe, daß Du damit schon einige Informationen und Ansatzpunkte hast, 
um Dein Problem zu lösen. Mehr kann man im Augenblick für Dich nicht tun, 
weil niemand (außer Dir) all die Informationen über Dein System (s.o.) zur 
Verfügung, die man zur Lösung Deines Problems bräuchte.


Viele Grüße
Lutz

php::bar PHP Wiki   -   Listenarchive