davidp: Problem mit Zeichenkodierung

Hi,

Auf der Webseite eines Freundes gibt es einen HTML-Teil und einen PHP-Teil, der aus einer Datenbank Datensätze mit u.a. Umlauten drinnen, rausliest.

Der HTML-Teil der vorher kommt und auch Umlaute wird richtig angezeigt, der Text aus der Datenbank nicht (stattdessen wird � (FireFox) angezeigt).

Die Zeichenkodierung ist automatisch auf Unicode (UTF-8) eingestellt. Ich kann sie zwar so einstellen, dass die Datensätze richtig angezeigt werden, aber dann wird jedoch der HTML-Teil falsch angezeigt.

Da auch andere Sonderzeichen vorkommen will ich das nicht mit Entities lösen.

Ich hoffe es kann mir jemand helfen,
davidp

Link zur Seite: http://mentralium.com/Articles.php?thema=GetAsyncKeyState (API)

  1. @@davidp:

    nuqneH

    Die Zeichenkodierung ist automatisch auf Unicode (UTF-8) eingestellt.

    An welcher Stelle?

    Das 'Content-Type'-Feld im HTTP-Header sagt lediglich "text/html", eine HTTP-EQUIV-Angabe ist im Dokument nicht vorhanden (auskommentiert: <!--<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />//-->).

    Der Browser errät dann wohl die Zeichencodierung. Wegen des BOMs (welches nicht da sein sollte) rät er wohl UTF-8.

    Ich kann sie zwar so einstellen, dass die Datensätze richtig angezeigt werden, aber dann wird jedoch der HTML-Teil falsch angezeigt.

    Aus der Datenbank kommen die Zeichen ISO-8859-1-codiert. Ändere dies.

    Qapla'

    --
    Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
    1. Hi,

      @@davidp:

      nuqneH

      Die Zeichenkodierung ist automatisch auf Unicode (UTF-8) eingestellt.

      An welcher Stelle?

      Vom Browser aus. (warscheinlich von ganz am Anfang)

      Das 'Content-Type'-Feld im HTTP-Header sagt lediglich "text/html", eine HTTP-EQUIV-Angabe ist im Dokument nicht vorhanden (auskommentiert: <!--<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />//-->).

      Dem HTML-Validator gefällt es aber nicht, wenn es nicht auskommentiert ist: HTML-Validator

      Grüße, davidp

      1. Hallo,

        Das 'Content-Type'-Feld im HTTP-Header sagt lediglich "text/html", eine HTTP-EQUIV-Angabe ist im Dokument nicht vorhanden (auskommentiert: <!--<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />//-->).
        Dem HTML-Validator gefällt es aber nicht, wenn es nicht auskommentiert ist: HTML-Validator

        natürlich nicht, denn dann hat er endlich einen konkreten Anhaltspunkt für die Codierung und weiß, dass es UTF-8 sein sollte. Dann scheitert er aber an den ISO-codierten Zeichen im Dokument, die in UTF-8 ungültige Byte-Sequenzen erzeugen.
        Die Tatsache, dass der Validator seine Arbeit verweigert, hängt also unmittelbar mit deinem Codierungsproblem zusammen.

        Ciao,
         Martin

        --
        Wissen erwirbt man, indem man immer das Kleingedruckte sorgfältig liest.
        Erfahrung bekommt man, indem man das nicht tut.
        1. @@Der Martin:

          nuqneH

          natürlich nicht, denn dann hat er endlich einen konkreten Anhaltspunkt für die Codierung und weiß, dass es UTF-8 sein sollte. Dann scheitert er aber an den ISO-codierten Zeichen im Dokument, die in UTF-8 ungültige Byte-Sequenzen erzeugen.
          Die Tatsache, dass der Validator seine Arbeit verweigert, hängt also unmittelbar mit deinem Codierungsproblem zusammen.

          ?? Dafür sehe ich keinen Anhaltspunkt.

          Dafür viele Fehler, weil die <http://de.selfhtml.org/html/xhtml/unterschiede.htm@title=Unterschiede zwischen XHTML und HTML> nicht beachtet wurden: <http://de.selfhtml.org/html/xhtml/unterschiede.htm#leere_elemente@title=leere Elemente> nicht geschlossen, unmaskierte '<' und '&' im http://de.selfhtml.org/html/xhtml/unterschiede.htm#script_style@title=PCDATA-Bereich.

          Script-Bereiche, die '<' und '&' enthalten, müssen in HTML-kompatiblem XHTML als CDATA gekennzeichnet werden. Noch besser wäre freilich, JavaScript-Code nicht im HTML zu notieren, sondern extern.

          Und die HTML-Auskommentierung des CSS-Bereiches ist auch überflüssig. Auch da gilt: Noch besser wäre freilich, CSS-Code nicht im HTML zu notieren, sondern extern.

          Qapla'

          --
          Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
          1. Hallo Gunnar,

            Dann scheitert er aber an den ISO-codierten Zeichen im Dokument, die in UTF-8 ungültige Byte-Sequenzen erzeugen.
            Die Tatsache, dass der Validator seine Arbeit verweigert, hängt also unmittelbar mit deinem Codierungsproblem zusammen.
            ?? Dafür sehe ich keinen Anhaltspunkt.

            ich schon: Der OP davidp berichtet einerseits, dass einige Zeichen als '?' angezeigt werden, wenn sein Browser die Codierung UTF-8 annimmt. Der Quelltext enthält also Bytefolgen, die in UTF-8 fehlerhaft sind. Gleichzeitig stellt davidp fest, dass es "dem Validator nicht gefällt", wenn er die meta-Anweisung bzgl. UTF-8 wirksam macht, also technisch eindeutige Indizien für UTF-8 sprechen.

            Ich weiß außerdem aus eigener Erfahrung, dass der Validator sich weigert, ein Dokument überhaupt erst zu betrachten, wenn es ungültige Zeichen enthält.

            Daher meine Schlussfolgerung: Er soll für die korrekte Codierung der Sonderzeichen sorgen, dann klappt's auch mit dem Validator. Dass man die Angabe zur Codierung im W3C-Validator auch manuell überschreiben kann, ist mir bekannt, aber das löst das Problem ja nicht.

            Ciao,
             Martin

            --
            Denken ist wohl die schwerste Arbeit, die es gibt. Deshalb beschäftigen sich auch nur wenige damit.
              (Henry Ford, amerikanischer Industriepionier)
  2. Moin!

    Die Zeichenkodierung ist automatisch auf Unicode (UTF-8) eingestellt. Ich kann sie zwar so einstellen, dass die Datensätze richtig angezeigt werden, aber dann wird jedoch der HTML-Teil falsch angezeigt.

    Ja, die Zeichen aus der Datenbank werden als ISO-8859-1 dargestellt.

    Hast du der DB-Connection gesagt, dass sie UTF-8 liefern soll? Die Connection codiert dir die Zeichen sonst nämlich um auf das Encoding, was du angegeben hast - wenn du nichts angegeben hast, gilt der definierte Standardwert, und das ist meist ISO-8859-1.

    SET NAMES "utf8" als allererstes Query nach dem Verbindungsaufbau hilft vermutlich schon.

    Link zur Seite: http://mentralium.com/Articles.php?thema=GetAsyncKeyState (API)

    Ein schlechtes Beispiel, weil da nur Umlaute aus der DB vorkommen, und nicht aus dem normalen Text.

    Abgesehen davon: Warum zum Teufel benutzt du für die Navigationsbuttons Flash? Was soll damit denn gewonnen werden? Ich glaube irgendwie nicht, dass Suchmaschinen sowas sehr toll finden, abgesehen davon finden es die Benutzer sicherlich nicht toll, weil sie auf die Flash-Tasten immer zweimal klicken müssen.

    Und wahnsinnige optische Features werden ja auch nicht realisiert, es ist eine ganz schlichte Taste, die man problemlos auch mit simplem HTML und etwas CSS herstellen könnte.

    Das würde ich auf jeden Fall ändern.

    - Sven Rautenberg

    1. Hi,

      SET NAMES "utf8" als allererstes Query nach dem Verbindungsaufbau hilft vermutlich schon.

      ja, danke das wars.

      Grüße, davidp

    2. Hi Sven!

      SET NAMES "utf8" als allererstes Query nach dem Verbindungsaufbau hilft vermutlich schon.

      Mit der mysqli-Extension sollte man allerdings die Methode set_charset verwenden.
      (Auch wenn ich das jetzt einfach nur unreflektiert nachplappere...)

      MfG H☼psel

      --
      "It's amazing I won. I was running against peace, prosperity, and incumbency."
      George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
      Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      1. Hi!

        SET NAMES "utf8" als allererstes Query nach dem Verbindungsaufbau hilft vermutlich schon.
        Mit der mysqli-Extension sollte man allerdings die Methode set_charset verwenden.
        (Auch wenn ich das jetzt einfach nur unreflektiert nachplappere...)

        Die mysql-Extension hat auch nachgerüstet und bietet seit PHP 5.2.3 mysql_set_charset() an. SET NAMES ist für die ISO-8859-Familie und UTF-8 ausreichend. "Lediglich" für ein paar der asiatischen Kodierungen ist es nicht verwedbar.

        Lo!