WernerK: UTF-8 Datei Umlaut

Hallo,
ich habe eine Textdatei die Umlaute wie ß. Ö und ä enthält. Diese Ursprungs-Textdatei ist als UTF8 angespeichert.
Ein PHP Script mit UTF8 Header (<meta http-equiv="Content-Type" content="text/html; charset=utf-8">)
liest diese Datei ein, macht ein paar Ersetzungen und speichert diese wieder ab.

$file = fopen($OutFile,"a");
fwrite($file, $string);
fclose($file);

Wenn ich die neue gespeicherte Datei dann mit Notepad++ anschaue, stehen die Umlaute "falsch" drin. z.b. anstatt
Groß => GroÃ

anstatt
Broschüre => Broschüre

Ich verstehe nicht warum?

Hat jemand eine Idee was man ändern muss?

vielen Dank
Gruss
Werner

  1. hi,

    $file = fopen($OutFile,"a");
    fwrite($file, $string);
    fclose($file);

    file_get_content() und file_put_content() ???

    PHP kodiert intern, meiner Erinnerung nach, immer utf8

    Vielleicht aber vorher mit utf8_encode() behandeln, wenn das was helfen sollte?

    Wenn ich die neue gespeicherte Datei dann mit Notepad++ anschaue, stehen die Umlaute "falsch" drin. z.b. anstatt
    Groß => GroÃ

    anstatt
    Broschüre => Broschüre

    Ich verstehe nicht warum?

    Vielleicht musst du die Kodierung beim Notepad++ korrekt einstellen?

    was gibt denn PHP mit var_dump($sting); aus? Und wie sieht das im Browser aus?

    mfg

    tami

    1. file_get_content() und file_put_content() ???

      ...contents(), mit "s", s.u.a. http://php.net/manual/de/function.file-get-contents.php

      mfg

      tami

    2. Tach!

      PHP kodiert intern, meiner Erinnerung nach, immer utf8

      Nein, PHP kodiert nicht in eine interne Darstellung um. Es nimmt einfach die Bytes, so wie sie kommen. Und genauso gibt es sie diese an seine Funktionen weiter. Lediglich einige spezielle Funktionen (z.B. utf8_en/decode, iconv) kodieren von den Bytes einer Kodierung in die Bytes einer anderen Kodierung um. Einige andere Funktionen bieten eine Berücksichtigung einer Kodierung bei ihrer Ausführung an (z.B. mb_string-Funktionen, htmlspecialchars).

      was gibt denn PHP mit var_dump($sting); aus? Und wie sieht das im Browser aus?

      Dabei hat man noch den Browser und seine Interpretation der ankommenden Daten zwischen deren Rohform und ihrer lesbaren Form. Besser ist es, an der Quelle die Bytewerte zu untersuchen (oder in eine zweifelsfrei interpretierbare Form zu bringen => Hexdarstellung). urlencode() kann man dazu gut missbrauchen, ansonsten bin2hex().

      dedlfix.

  2. Tach!

    ich habe eine Textdatei die Umlaute wie ß. Ö und ä enthält. Diese Ursprungs-Textdatei ist als UTF8 angespeichert.
    Ein PHP Script mit UTF8 Header (<meta http-equiv="Content-Type" content="text/html; charset=utf-8">) liest diese Datei ein, macht ein paar Ersetzungen und speichert diese wieder ab.

    Für PHP-Dateien gibt es keine Möglichkeit zur Angabe der Kodierung, in der sie gespeichert ist - sieht man mal von der Möglichkeit einer BOM ab. Die Kodierungsangabe in Richtung Browser ist für den Vorgang irrelevant, weil nur mit einer lokalen Datei gearbeitet wird. Da PHP noch nicht UTF-8-fähig ist, kann es den Inhalt der Datei nur anhand der Bytes verarbeiten. Das heißt also, dass Literale, die in deinem Quelltext stehen, mit denselben Bytes geschrieben sein müssen wie in der Datendatei. Sprich: Deine PHP-Datei muss als UTF-8 gespeichert sein.

    Wenn ich die neue gespeicherte Datei dann mit Notepad++ anschaue, stehen die Umlaute "falsch" drin. z.b. anstatt
    Groß => GroÃ
    anstatt
    Broschüre => Broschüre
    Ich verstehe nicht warum?

    Dann musst du mal genauer untersuchen, was wirklich ist. Auch für einfache Textdateien gibt es keine Metadaten, die in irgendeiner Weise ihre Kodierung verraten würden (außer dem Spezialfall BOM). Wenn du die Datei also öffnest, liest sie das öffnende Programm entweder zufällig gemäß der richtigen Kodierung oder du gibst explizit eine an. Beim Öffnen mit Notepad++ kann man keine Kodierung angeben, man kann sie nur nach dem Öffnen im Menü Encoding umstellen.

    Außerdem empfiehlt es sich im Zweifelsfall mit einem Hexeditor nachzuschauen, was nun konkret für Bytes in der Datei stehen. Notepad++ kennt dazu ein Plugin namens HEX-Editor.

    dedlfix.

    1. Hallo,

      <<Deine PHP-Datei muss als UTF-8 gespeichert sein.

      Wenn ich das mache dann gibt es Probleme mit dem Session Header und das Resultat ist auch nicht anders. Immer noch falsche Umlaute bzw. falsch kodiert im Textfile.

      Gruss
      Werner

      1. Tach!

        Deine PHP-Datei muss als UTF-8 gespeichert sein.
        Wenn ich das mache dann gibt es Probleme mit dem Session Header und das Resultat ist auch nicht anders. Immer noch falsche Umlaute bzw. falsch kodiert im Textfile.

        Ich kann nicht hellsehen und aus solchen allgemeinen Aussagen nur entnehmen, dass du was falsch machst und anscheinend auch nicht die gegebenen Tipps berücksichtigst.

        "Probleme mit dem Session Header" kann es viele geben. Welches ist es denn genau? Hast du die Datei als UTF-8 mit BOM gespeichert? Dann mach das nochmal, aber ohne BOM. Die stört, weil sie vor dem <?php zu stehen kommt und damit als Ausgabe angesehen wird.

        Wenn etwas falsch ist, kann man durch wildes rumprobieren zum richtigen Ergebnis kommen. Besser ist jedoch, genau nachzusehen, was wirklich ist und darauf seine Maßnahmen aufzubauen. Also schau die bitte die Bytewerte der fraglichen Zeichen/Wörter an. Dazu solltest du Dateien im Hex-Editor öffnen und Werte während einer Verarbeitung in Hexadezimal-Darstellung ausgeben lassen. Nimm unter PHP urlencode(), das zwar nicht dafür gedacht ist, aber gut lesbare Ergebnisse liefert.

        dedlfix.

  3. Hi,

    ich habe eine Textdatei die Umlaute wie ß. Ö und ä enthält. Diese Ursprungs-Textdatei ist als UTF8 angespeichert.

    Mit BOM?

    Ein PHP Script mit UTF8 Header (<meta http-equiv="Content-Type" content="text/html; charset=utf-8">)
    liest diese Datei ein, macht ein paar Ersetzungen und speichert diese wieder ab.

    Ohne BOM?

    Wenn ich die neue gespeicherte Datei dann mit Notepad++ anschaue, stehen die Umlaute "falsch" drin. z.b. anstatt
    Groß => GroÃ

    weil jetzt die BOM fehlt?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Tach!

      Ein PHP Script mit UTF8 Header (<meta http-equiv="Content-Type" content="text/html; charset=utf-8">)
      liest diese Datei ein, macht ein paar Ersetzungen und speichert diese wieder ab.
      Ohne BOM?

      Wenn diese Theorie stimmen soll, müsste die BOM beim Ersetzen explizit berücksichtigt worden sein. Von sich aus entfernt PHP keine Teile aus einem String oder beim Lesen und Speichern einer Datei.

      dedlfix.

      1. Hi,

        Wenn diese Theorie stimmen soll, müsste die BOM beim Ersetzen explizit berücksichtigt worden sein.

        Werner hat nur den Code gezeigt, wie die Datei geschrieben wird.
        Wie er die Datei liest, hat er verschwiegen (genauso wie er verschwiegen hat, wie er Ersetzungen tätigt).

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  4. hi,

    Wenn ich die neue gespeicherte Datei dann mit Notepad++ anschaue, stehen die Umlaute "falsch" drin. z.b. anstatt
    Groß => GroÃ

    anstatt
    Broschüre => Broschüre

    das sind die richtigen Bytes.
    ß c39f
    ü c3bc

    Wenn die in der Datei stehen isses utf8.

    Horst