Daniel_T: Zeichensatz-Problem UTF-8

Hallo,

ich lese eine Datei, die als UTF-8 gespeichert ist, ein:

$inhalt = file_get_contents("URL/seite.html");

Gebe ich $inhalt aus, steht für z.b. die Umlaute ä,ö,.. das "A1/4" Zeichen, das Eurozeichen funktioniert aber.

Mache ich utf8_decode($inhalt), stimmen die Umlaute, aber das Eurozeichen nicht.

Habe ich nen Denkfehler bei den Umwandlungen?

Baba Daniel

  1. Habe ich nen Denkfehler bei den Umwandlungen?

    Weiß ich nicht, aber dein Problem gehört in die Kategorie PHP, was ich mit diesem Posting geändert habe :)

    Siechfred

    --
    Ich bin strenggenommen auch nur interessierter Laie. (molily)
    1. Weiß ich nicht, aber dein Problem gehört in die Kategorie PHP, was ich mit diesem Posting geändert habe :)

      Ops. Da hab ich mich verklickt, sorry :)

      Siechfred

      Daniel

      PS: Weiter bin ich leider immer noch nicht. Hab nun schon über verschiedene Headerangaben usw versucht eine korrekte Darstellung zu erhalten, aber nix hilft.

  2. Hallo,

    ich lese eine Datei, die als UTF-8 gespeichert ist, ein:

    $inhalt = file_get_contents("URL/seite.html");

    Gebe ich $inhalt aus, steht für z.b. die Umlaute ä,ö,.. das "A1/4" Zeichen, das Eurozeichen funktioniert aber.

    Logisch, bis auf das Eurozeichen:

    • in ISO-8859-1 (PHPs nativem Zeichensatz) ist es nicht enthalten.
    • Dafür aber in den Varianten ISO-8859-15 und Windows-1252. Allerdings ist es in diesen Zeichensätzen genau 1 Byte lang. In UTF-8 ist das Eurozeichen aber drei Byte lang und müsste, als ISO-8859-1 interpretiert, so dargestellt werden: "â<kästchen>¬"[*] Das in der Mitte ist ein Steuerzeichen (BPH), das mir nichts sagt ;).
      [*] Das Steuerzeichen durfte ich leider nicht in die Nachricht schreiben.

    Interessant wäre jetzt zu wissen, warum ausgerechnet das Eurozeichen korrekt ausgegeben wird.
    Ist die abgerufene Seite Deine eigene? Welchen Zeichensatz zeigt Dein Browser an, wenn Du die Seite abrufst (über das Menü "Ansicht" herauszufinden)?

    Mache ich utf8_decode($inhalt), stimmen die Umlaute, aber das Eurozeichen nicht.

    Als was wird das Eurozeichen dargestellt?

    Habe ich nen Denkfehler bei den Umwandlungen?

    Da hat sich eher wo anders ein Fehler eingeschlichen.

    btw: in welchem Zeichensatz speicherst Du Deine Skripte? Als was werden die ausgeliefert?

    Gruß,
    David

    1. Hallo,

      Hallo :)

      Hatte leider keine Zeit bis jetzt, mich dem Problem nochmal anzunehmen, darum die späte Antwort:

      Also die Seite (Input.html): UTF-8

      Gespeichert habe ich das php-Skript im UltraEdit Standard. Habe es aber soeben mit verschiedenen Skript-Speicherarten versucht, hilft nichts.

      Stimmt, es wird "nun", statt dem Euro Zeichen, das "a<kästchen>¬" angezeigt, wenn ich kein utf8_decode() mache. Mache ich das utf8_decode, um die Umlaute anzeigen zu können, wird aus dem Euro ein ?.

      Was noch zu erwähnen ist:
      Ich generier aus einem HTML Table eine CSV. Dazu wird das Skript mit dem Header:

      header('Content-type: application/csv;');
      header('Content-Disposition: attachment; filename="download.csv"');

      aufgerufen.

      Die Datei wird dann gespeichert, und mit Excel oder OpenOffice geöffnet.

      Gruß,
      David

      Baba Daniel, in der Hoffnung nun noch Antwort zu erhalten :)

      1. Also die Seite (Input.html): UTF-8

        Bis hierhin in Ordnung.

        Gespeichert habe ich das php-Skript im UltraEdit Standard. Habe es aber soeben mit verschiedenen Skript-Speicherarten versucht, hilft nichts.

        Die Kodierung, in der du das Script speicherst, ist grundsätzlich egal, solange du keine Zeichenketten darin hardcodierst, z.B. in Variablen oder in Regulären Ausdrücken.

        Ich generier aus einem HTML Table eine CSV. Dazu wird das Skript mit dem Header:

        Hier könnte der Knackpunkt sein:

        header('Content-type: application/csv;');
        header('Content-Disposition: attachment; filename="download.csv"');

        Du gibst keine Zeichenkodierung an und hast damit keine Kontrolle mehr über die Konsistenz der Daten. Prüfe bitte mal die Kodierung der erzeugten CSV-Datei und ergänze die Header-Angaben wie folgt:

        header('Content-type: application/csv; charset=utf-8');

        Damit sollten die Daten utf-8-kodiert in der CSV-Datei ankommen.

        Siechfred

        --
        Ich bin strenggenommen auch nur interessierter Laie. (molily)
      2. Hallo Daniel,

        Stimmt, es wird "nun", statt dem Euro Zeichen, das "a<kästchen>¬" angezeigt, wenn ich kein utf8_decode() mache. Mache ich das utf8_decode, um die Umlaute anzeigen zu können, wird aus dem Euro ein ?.

        Es freut Dich bestimmt nicht, das zu hören, aber PHP verhält sich hier vollkommen korrekt. Das PHP-Manual sagt zu utf8_decode:

        utf8_decode — Converts a string with ISO-8859-1 characters encoded with UTF-8 to single-byte ISO-8859-1

        Das wolltest Du ja auch. Das Problem ist aber, dass ISO-8859-1 das Euro-Zeichen nicht enthält. Daher fügt PHP bei der Konvertierung ein Fragezeichen ein.

        Du könntest alle Euro-Zeichen durch die entsprechende HTML-Entität (&euro;) ersetzen, das geht aber nicht für eine CSV-Datei. Also musst Du einen anderen Zeichensatz für Deine Datei verwenden.

        Da gibt es zwei sinnvolle Lösungen:
        * Du gibst die Datei einfach als UTF-8 aus. Bei OpenOffice lässt sich das encoding der Datei beim Import angeben, bei Excel weiß ich es nicht.
        * Du verwendest Windows-1252 (CP1252). Das sollte mit Excel zusammen auf jeden Fall funktionieren.

        Ein weiterer "westlicher" Zeichensatz, der das Euro-Zeichen enthält, ist ISO-8859-15. Der ist aber, was die zusätlzichen Zeichen im Vergleich zu ISO-8859-1 angeht, nicht kompatibel mit Windows-1252. Bringt also wahrscheinlich nicht wirklich was in Bezug auf Excel.

        Zur Umwandlung kannst Du dann natürlich nicht mehr utf8_decode() nehmen, dazu gibt es aber auch noch [link:http://php.net/mb-convert-encoding@title=mb_convert_encoding()] und [link:http://php.net/iconv@title=iconv()]. Du musst ausprobieren, was auf dem von Dir verwendeten System verfügbar ist.

        header('Content-type: application/csv;');

        müsstest Du ändern zu
        header('Content-type: application/csv; charset=utf-8'); oder
        header('Content-type: application/csv; charset=CP1252'); (statt "CP1252" geht auch "Windows-1252")

        Baba Daniel, in der Hoffnung nun noch Antwort zu erhalten :)

        sischer datt ;)
        Gruß,
        David

        1. Hallo

          Danke mal an euch beide.

          Es hat funktioniert, in dem ich im header utf-8 angegeben habe. So muss man im Excel/OpenOffice aber selber die Kodierung auswählen.

          Das Konvertieren hat leider nicht funktioniert, aber wir belassen es nun dabei.

          Viele Dank :)

          Baba Daniel