PHP fopen mit richigem Charset wg. Umlauten

Überkinger

Lieutenant
Registriert
Juli 2010
Beiträge
600
Hallo,

ich erstelle per PHP eine kleine Datei die aus Kompatibilitätsgründen zum eingesetzten CMS im ISO-8858-1 vorliegen muss. Die Datei enthält eine Zeichenkette mit Umlauten und Sonderzeichen. Die Datei wir mit fopen auch korrekt geöffnet und mit HTML-Content gefüllt. Per Meta-Tag wird der Charset auch auf ISO-8859-1 festgesetzt, die Umlaute in der Datei werden bei der Ausgabe trotzdem falsch angezeigt.

Ich tippe darauf, dass es daran liegt. dass die per PHP geschriebene Datei nicht als ISO-8859-1 geschrieben wird, oder? Wie komme ich das Problem in Griff?
 
PHP:
fwrite($file, iconv( "UTF-8", "ISO-8858-1//TRANSLIT", $content));

Oder aber vor der Ausgabe konvertieren.
 
Kanibal schrieb:
PHP:
fwrite($file, iconv( "UTF-8", "ISO-8858-1//TRANSLIT", $content));

Oder aber vor der Ausgabe konvertieren.

Das heißt, die Datei selbst kann gar nicht als ISO oder UTF vorliegen, sondern nur die darin enthaltenen Zeichen? Das würde heißen, dass es im Prinzip wurst ist in welchem Charset die Zeichenkette da reingeschrieben wird. Hmm, so richtig blicke ich noch nicht durch...

Hmm, das bedeutet, dass nur jedes Zeichen in der Zeichenkette von sich weiß, welchem Charset es angehört und die Datei nur den Rahmen bildet? Daher weiß der Kuchen nicht, wie er heißt und welche Zutaten in ihm Stecken.

Das Metatag bilden den Namen des Kuchens, die Zutaten den charset der einzelnen Zeichen?
 
Wie komme ich das Problem in Griff?
Ich bin inzwischen dazu übergegangen immer mit dem HTML-Codes für Sonderzeichen und Umlaute zu arbeiten, dann hat man diese Probleme nicht mehr und muss sich auch (fast) keine Gedanken mehr über die Codierung machen.

Mit Notepad++ kannst du auch mit Suchen und ersetzen (Strg+F) alle Sonderzeichen und Umlaute in allen Dateien die betroffen sind ganz fix durch die passenden HTML-Codes ersetzen.
 
@ M.E.: Mal ganz krass: Das hilft dir das bei japanischen Zeichen genau wie weiter?
 
@Überkinger

Die Geschichte mit den Charsets... herrlich :)

Also. Prinzipiell existieren keine Zeichen. Es gibt nur Bytes/Zahlen. Ein Textdokument ist also eine Aneinanderreihung von Zahlen. Das Charset sorgt nun dafür, dass jeder Zahl/Byte ein entsprechendes Zeichen zugewiesen wird. Wenn du also ein UTF-8 Dokument als ASCII-Dokument öffnest, dann kann ASCII beispielsweise mit den japanischen Zeichen nichts anfangen, weil es für die entsprechenden Zahlen kein Zeichen besitzt.

Was nun bei dir das Problem ist:
Du hast ein Dokument unbekannten Charsets, dass du unbedingt auf ISO-8858-1 trimmen musst. Dein Browser versucht nämlich, dein "HTML-Dokument" als ISO-8858-1 zu interpretieren (sagst du ihm über den Metatag) und wird also bei (z.B.) UTF-8 Zeichen scheitern.

Grundsätzlich kann ich dir raten, bei unbekannten Charsets von UTF-8 auszugehen... das bietet (imho) die höchste Abwärtskompatibilität.

Deshalb musst du vor der Ausgabe, die entsprechenden Zeichen in das ISO-8858-1 Pendant "umwandeln". Dafür nutzt du am besten die Funktion iconv. Das Dokument liest du dafür einfach als String ein (file_get_content), konvertierst ihn und schiebst ihn per echo raus.
 
Kanibal schrieb:
@Überkinger

Die Geschichte mit den Charsets... herrlich :)....

Super. Danke schön! Das bedeutet aber auch, dass ich immer wissen muss, welches der Quell-Zeichensatz ist. Bei Notepad++ nehme ich also stets UTF-8 w/o BOM. Notepad++ weiß dann, dass einem Ä andere Bits zugewiesen werden, als wenn ich ISO-8859-1 eingestellt habe...

Und wie gehe ich vor, wenn ich ein anderes Script verwende und feststellen will, in welchem Charset es vorliegt?

Den Unterschied würde ich nur dann sehen, wenn ich zwei gleiche Dateien in einem HEX-Editor anschauen würde, die eine mit UTF-8, die andere mit ISO-8859-1? Ah, jetzt klingelt es. Also immer schön mit Editoren arbeiten, die UTF-8 aktiv unterstützen und den Mode auch anzeigen. Notepad.exe ist daher Müll, da man nicht sieht und weiß, welcher Charaset angewendet wird.
 
Zuletzt bearbeitet:
Notepad arbeitet mit dem Charset, in welchem die Datei angelegt ist, völlig transparent. Du bekommst die Charset-Einstellung nur beim Öffnen/Speichern zu Gesicht.
 

Ähnliche Themen

Zurück
Oben