Textdatei als UTF-8 speichern -> Darstellung der Umlaute

Abend,
ich habe eine Website mit eigenem CMS auf UTF-8 umgestellt. Soweit funktioniert das speichern und auslesen fehlerfrei (Umlaute werden korrekt dargestellt), allerdings sehen die Umlaute in der Textdatei etwas komisch aus, z.B. so:

Jahresüberblick
Gibt es eine Möglichkeit, das anders zu speichern (als ü oder einfach ü), gibt es in PHP vielleicht eine passende Funktion?

lg

PHP: htmlentities - Manual

oder

PHP: htmlspecialchars - Manual

wandeln i.d.R. die Umlaute in HTML-Schreibweise um.

Hab ich schon probiert. Das ändert entweder nichts oder zeigt auf der Webseite auch diesen Zeichensalat an.

allerdings sehen die Umlaute in der Textdatei etwas komisch aus

Wie öffnest du denn diese Textdateien? Vielleicht mit einem Editor, der kein UTF-8 unterstützt bzw. der standardmäßig nicht auf UTF-8 eingestellt ist?

Gib als Encoding in deiner Webseite auch UTF-8 an, dann funktionierts auch :wink:

es gibt mehrere faktoren die wichtig sind:

  1. IDE (Editor) muss UTF8 nutzen
  2. Datenbankverbindung muss UTF8 verwenden
  3. Datenbankencoding muss UTF8 sein
  4. Ausgabe auf der Webseite muss UTF8 sein

sobald eins davon nicht passt, hast du probleme mit dem encoding, umlaute zu wandeln ist völlig unnötig.

Also ausgegeben wird alles korrekt auf der Website. Nur öffne ich die Textdatei im Browser, sieht man die komischen Zeichen. Bei den Seiteninformationen wird angezeigt, dass die Textdatei ISO-8859-1 hat. Wird sie jetzt in UTF-8 gespeichert und vom FF nur standardmäßig als ISO-8859-1 angezeigt? Dann hätte sich das Problem ja erübrigt :slight_smile:
Gibt es eine PHP Funktion, die eine UTF-8-txt in einer ISO-8859-1-Webseite korrekt anzeigt?

Besonders wichtig ist, dass du einen entsprechenden Header mitsendest:

Für reine Texte:
[PHP]
header(‚Content-Type: text/plain; charset=utf-8‘);
[/PHP]

Für HTML:
[PHP]
header(‚Content-Type: text/html; charset=utf-8‘);
[/PHP]

Wird sie jetzt in UTF-8 gespeichert und vom FF nur standardmäßig als ISO-8859-1 angezeigt?

Wenn der Inhalt ansonsten im Rahmen der Seite (wo er vermutlich noch irgendwie von einem PHP-Script geladen wird?) richtig aussieht, liegt’s sicher einfach daran, ja.

Mit .htaccess kannst du das default charset (wahrscheinlich) umstellen, falls es dich arg stört: W3C I18N FAQ: Setting charset information in .htaccess

Ist es nicht besser, einen Meta-Tag zu setzen?

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

Angenommen ich bin auf dieser Seite, speichere sie ab und öffne dann die gespeicherte Version - sollten dann Umlaute nicht wieder falsch dargestellt werden? Oder wird dabei in irgendeiner Weise mitgespeichert, dass im header UTF-8 als charset angegeben ist?

Der Meta-Tag wird von etwaigen Servereinstellungen überschrieben. Das ist eine sehr häufige Fehlerquelle, weil das nicht unbedingt offensichtlich ist. Man denkt, man hätte die Seite korrekt per meta-Tag auf UTF-8 umgestellt, aber trotzdem bleibt die Darstellung fehlerhaft, weil der Content-Type-Header des Servers das Charset mit ISO-8859-1 überschreibt.

Das tatsächliche Encoding einer Seite lässt sich im Firefox etwa im Kontextmenü unter „View Page Info > Encoding“ einsehen.

Was das Abspeichern (also Herunterladen) angeht, hast du aber meiner Ansicht nach Recht. Da könnte ein meta-Tag die Darstellung unter Umständen berichtigen.

Gut ist’s, beides zu setzen. (Vielleicht ist der meta-Tag sogar vorgeschrieben, das weiß ich gerade nicht.) Für die Darstellung im Web ist in der Regel der Content-Type-Header entscheidend.

Dann lag es an der Servereinstellung, dass beim Anschauen der Textdatei die Umlaute komisch aussehen.
Ich hab meine Webseiten zum einen per Meta-Tag auf UTF-8 gestellt und dann noch per PHP-Header. Reicht das oder muss ich in der htaccess noch etwas ändern?

Das reicht. header() in PHP und Einstellungen in der .htaccess verändern beide denselben Wert, nämlich den Header der HTTP-Response, mit der deine Seite an den Client übermittelt wird.

Durch die Einstellungen in der .htaccess-Datei könntest du höchstens noch zusätzlich erreichen, dass Nicht-PHP-Seiten (zum Beispiel eine direkt per URL angewählte .txt-Datei) auch mit dem richtigen Charset ausgeliefert werden. Dort steht die header()-Funktion ja logischerweise nicht zur Verfügung.