Michi: Mit htmlspecialchars werden keine Umlaute angeziegt

Ich habe ein Formular, wenn es durchläuft werden die Daten nochmlas ausgegeben, das mache ich dann mit:

htmlspecialchars($_POST['ort'])

jetzt ist mir aufgefallen, das Wörter mit deutschen Umlauten nicht ausgegeben werden, obwohl sie aber in der Variable sind.

Dann wollte ich das so korrigieren, das ich vorher in den Variablen die Umlaute gegen ä etc. ersetze.

Jetzt werden zwar die Variablen ausgegeben, aber leider mit ä.

Wie kann ich das verhindern?

Michi

  1. O, ich glaub ich hab die Lösung für mein Problem doch selber gefunden:

    Aus

    htmlspecialchars($_POST['ort'])

    wird

    htmlentities($_POST['ort'], ENT_HTML401, "ISO-8859-1")

    dann kann ich mir auch das vorherige Umwandeln der Umlaute gegen ä etc. ersparen!

    Denke ich zumindestens

    Michi

    1. Denke ich zumindestens

      Ich denke, Du hast ein Problem mit den verwendeten Zeichensätzen. Im Handbuch steht übrigens:

      string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )

      Also gänge auch: htmlspecialchars($_POST['ort'], ENT_HTML401, "ISO-8859-1")

      Die Frage ist, was Du willst:

      fastix@trainer:~$ echo '<?php print htmlentities(str_replace("ö", "&ouml;", "Jörg"))."\n"; ?>' | php
      J&amp;ouml;rg

      War es etwa sowas? Das wäre eher selten der Fall.

      Jörg Reinholz

      1. @@Jörg Reinholz:

        nuqneH

        Ich denke, Du hast ein Problem mit den verwendeten Zeichensätzen.

        Ich denke, du verwechselst Zeichensatz und Zeichencodierung.

        Qapla'

        --
        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
        1. @@Gunnar Bittersmann:

          Ich denke, du verwechselst Zeichensatz und Zeichencodierung.

          Ist mir offen gestanden egal. Betrachte es als SEO-Maßnahme, wenn ich vom UTF-8 Zeichensatz statt von der UTF-8 Kodierung schreibe.

          Jörg Reinholz

          1. Tach!

            Betrachte es als SEO-Maßnahme, wenn ich vom UTF-8 Zeichensatz statt von der UTF-8 Kodierung schreibe.

            Im mysqld-Abschnitt einer my.cnf ist character-set-client eine Option, die keine andere Wirkung entfaltet, als eine Warnung ins Logfile zu schreiben. default-character-set und default-collation lassen den MySQL-Server gar nicht erst starten. Sie sind auch in der Dokumentation der Server-Optionen nicht enthalten.

            Die Verwendung von

            mysql_query('SET NAMES utf8');
              mysql_query('SET CHARACTER_SET utf8');

            nacheinander ist auch nicht sinnvoll. Egal in welcher Reihenfolge man diese beiden Statements absetzt, das zweite überschreibt immer die vom ersten gemachten Einstellungen. Im Gegensatz zu SET NAMES hat aber SET CHARACTER SET (ohne Unterstrich!) noch eine unangenehme Nebenwirkung, wenn der Konfigurationswert der verwendeten Datenbank ungünstig gesetzt ist. Connection Character Sets and Collations

            Zudem steht im Artikel auch nicht, dass die Kodierung der Felder auf UTF-8 stehen muss, damit da auch UTF-8 drin gespeichert werden kann. character-set-server ist nur ein Default-Wert für neu angelegte Datenbanken, nichts weiter. Bestehende Daten werden davon nicht angepasst. Der Konfigurationswert für Datenbanken ist seinerseits nur ein Defaultwert für neu angelegte Tabellen, zuzüglich der Nebenwirkung von SET CHARACTER NAMES. Der Konfigurationswert für Tabellen ist seinerseits nur ein Defaultwert für neu angelegte Felder. Erst die Feldangabe sagt etwas über die Kodierung des Inhalts aus. Wenn diese Feldkodierung nicht beachtet wird, nützt die korrekte Aushandlung beim Verbindungsaufbau wenig, denn beim Umkodieren zwischen Verbindung und Feld (bei unterschiedlichen Kodierungen) können Datenverluste auftreten.

            dedlfix.

            1. Tach!

              He, Danke. Ich hatte noch an dem Artikel gearbeitet und habe jetzt Deine Anmerkungen mit berücksichtigt.

              Jörg Reinholz

              1. Tach!

                He, Danke. Ich hatte noch an dem Artikel gearbeitet und habe jetzt Deine Anmerkungen mit berücksichtigt.

                Nochmal explizit: Ein SET-NAMES-Statement ist ausreichend, wenn man mysql_set_charset() nicht verwenden kann. character_set_client ist nur ein Drittel der Miete. Dazu kommt noch character_set_results und character_set_connection. Alle drei Werte werden von SET NAMES auf einmal gesetzt. Es ist nicht notwendig für die Verbindung außer SET NAMES noch was anderes einzustellen.

                Das character_set_server bringt dir nur dann einen Vorteil, wenn du Datenbanken neu anlegen willst. Zu bestehenden Datenbanken hinzuzufügende Tabellen und zu Tabellen hinzuzufügende Felder werden damit nicht erreicht. Es ist besser, die Angaben jeweils explizit zusetztn, und zwar nicht nur für Datenbank und Tabelle sondern auch für jedes einzelne String-Feld. Zumindest sollte man hinterher prüfen, ob die Default-Werte gegriffen haben - und ob es die richtigen waren.

                dedlfix.

                1. He, Danke....
                  Nochmal explizit:

                  Nochmal Danke. Ich denke, jetzt bist Du zufrieden, war ja auch alles richtig, was Du geschrieben hast. Soll ich Dich als Autor mit nennen? Wenn ja: "Wie wünscht der Herr den Eintrag"?

                  Jörg Reinholz

                  1. Tach!

                    Ich denke, jetzt bist Du zufrieden,

                    Fast. Ich würde nur mysql_set_charset() und als Ersatz SET NAMES erwähnen. Die drei Einzelwerte zu kennen, die SET NAMES setzt, ist nicht so besonders wichtig. Sie zu Fuß zu setzen, ist müßig, besonders weil man mit einer der beiden genannten Möglichkeiten in einem Schritt zu Ziele kommt.

                    Soll ich Dich als Autor mit nennen?

                    Nö, ich ha ja "meine eigene" Zeichenkodierungs-"Spielwiese" im SELFHTML-Wiki.

                    Übrigens, die Unterscheidung zwischen Zeichenkodierung und Zeichensatz kommt besonders gut bei HTML zum Vorschein. "Formulardaten werden normalerweise in der Kodierung, also mit dem Zeichensatz zurück gesendet, in welchem der Browser das Formular empfangen hat (siehe oben)." Da haben wir nämlich den Salat. Der Zeichensatz - also die Gesamtheit aller in HTML nutzbaren Zeichen - ist Unicode (definiert seit mindestens HTML 4). Die Zeichenkodierung eines Dokuments ist (trotz "charset"-Benennung) dann aber zum Beispiel UTF-8 oder auch ISO-8859-1. Mit UTF-8 ist jedes Zeichen direkt darstellbar, ISO-8859-1 kann nur die ersten 256, der Rest muss als Krücke namens NCR oder Entity notiert werden. Somit kann man auch mit dieser Kodierung den gesamten Unicode-Zeichensatz nutzen.

                    dedlfix.

          2. @@Jörg Reinholz:

            nuqneH

            Ich denke, du verwechselst Zeichensatz und Zeichencodierung.

            Ist mir offen gestanden egal. Betrachte es als SEO-Maßnahme, wenn ich vom UTF-8 Zeichensatz statt von der UTF-8 Kodierung schreibe.

            Nein, ich betrachtes es als Ahnungslosigkeit des Autors. Einen Fachartikel, der grundlegende Begriffe falsch verwendet, kann ich nicht ernst nehmen. Das zeugt davon, dass der Autor nicht weiß, wovon er spricht.

            “Accuracy in terms is an important element in any profession” (Joseph Alessio, https://twitter.com/g16n/status/294008376101310465)

            “A teaser with a wrong term […] throws a bad light on the article.” (icke, https://twitter.com/g16n/status/225955675275149312)

            „UTF-8-Zeichen(satz)“ gehort zu den Sachen, die es nicht gibt.

            Qapla'

            --
            „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
            1. Nein, ich betrachtes es als Ahnungslosigkeit des Autors. Einen Fachartikel, der grundlegende Begriffe falsch verwendet, kann ich nicht ernst nehmen. Das zeugt davon, dass der Autor nicht weiß, wovon er spricht.

              Du meinst also, "Zeichensatz" sei falsch?

              Hm. Im HTTP-Header schreibt man: "Content-Type: text/html; charset=UTF-8".
              Hm. Im Mail-Header schreibt man: "Content-Type: text/plain; charset=UTF-8".
              Ich könnte das fortsetzen. Im englischen, also praktisch immer, wo eingestellt oder programmiert wird,ist vom "charset" oder vom Zeichensatz die Rede.

              Dann wären also alle dumm und machen das falsch, denn ich übersetze das allseits verwendete "charset" mit "Zeichensatz", denn ein "set of chars" ist ein "Satz von Zeichen". Ich halte mich einfach mal daran.

              Du meinst "Zeichenkodierung" sei zwingend? Ich meine: "Nein, so ist das nicht."

              Denn "Zeichensatz" ist auch treffender, weil man sich hierunter sehr gut eine tabellarische Anordnung der Zeichen zu einer Nummer vorstellen kann (was ja auch so stattfindet), während in der Vorstellung von gewöhnlichen Menschen eine "Kodierung" womöglich der Art und Weise der Speicherung einer Vorschrift entspricht, wie ein bestimmtes Zeichen in einer Schriftart bei bestimmter Größe e.t.c. dargestellt werden soll.

              Ganz ehrlich: Was fängst Du wegen einem S...ßd...k einen Glaubenskrieg an und warum meinst Du mich hier wegen eines solchen schnöden Unsinns mit Begriffen wie "Ahnungslosigkeit" belegen zu müssen? Muss als nächstes erst mal jeder mit mindestens 4 Zeilen Allah preisen - oder gibt es Stockhiebe, wenn jemand zu den 5 festgelegten Gebetszeiten antwortet? Verfallen wir in einen Fundamentalismus?

              Für mich sieht es so aus.

              Jörg Reinholz

              1. Hi,

                Hm. Im HTTP-Header schreibt man: "Content-Type: text/html; charset=UTF-8".
                Hm. Im Mail-Header schreibt man: "Content-Type: text/plain; charset=UTF-8".

                Zu der Zeit, als diese Header entstanden, war das praktisch noch dasselbe (es gab praktisch nur 1-Byte-Charsets - ASCII, EBCDIC, ISO-8859-x ...).
                Als es dann soweit war, daß Encoding und Charset praktisch unterschiedlich wurden, war es zu spät - den Header umzudefinieren, hätte alle existierende HTTP/Mail/...-Software vor Probleme gestellt.
                (Aus diesem Grund heißt der HTTP-Header auch immer noch Referer - obwohl das eigentlich Referrer heißen müßte - irgendwer hat's in der Definition falsch geschrieben, und als es auffiel, war's zu spät ...)

                Bei XML, das wesentlich später eingeführt wurde, heißt es aber
                <?xml version="1.0" encoding="utf-8" ?>

                Hier mußte man keine Rücksicht auf bestehende Software nehmen, da es ja keine gab ...

                cu,
                Andreas

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

                  nuqneH

                  (Aus diesem Grund heißt der HTTP-Header auch immer noch Referer - obwohl das eigentlich Referrer heißen müßte - irgendwer hat's in der Definition falsch geschrieben, und als es auffiel, war's zu spät ...)

                  Aus diesem Grund heißt die HTML-Zeichen-Entity-Referenz auch immer noch &sbquo; – obwohl sie eigentlich &bsquo; heißen müsste – irgendwer hat’s in der Definition falsch geschrieben, und als es auffiel, war’s zu spät …

                  Qapla'

                  --
                  „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
              2. @@Jörg Reinholz:

                nuqneH

                Hm. Im HTTP-Header schreibt man: "Content-Type: text/html; charset=UTF-8".
                Hm. Im Mail-Header schreibt man: "Content-Type: text/plain; charset=UTF-8".
                Ich könnte das fortsetzen.

                Mit nochmal dem Gleichen? In beiden Fällen handelt es sich um dasselbe: eine MIME-Typ-Angabe.

                Im englischen, also praktisch immer, wo eingestellt oder programmiert wird,ist vom "charset" oder vom Zeichensatz die Rede.

                Nein, da liegst du falsch. In XML bspw. heißt es, wie es muss: encoding.

                Dann wären also alle dumm und machen das falsch

                „Dumm ist, wer Dummes tut.“

                das allseits verwendete "charset"

                … stammt aus einer Zeit, wo es verschiedene Zeichensätze mit jeweils eigenen Zeichencodierungen gab.

                Der Zeichesatz Latin-1 (für mittel- und westeuropäische Sprachen) bspw. lässt sich mit der Zeichencodierung ISO 8859-1 codieren; der Zeichesatz Latin-2 (für mittel- und osteuropäische Sprachen) mit der Zeichencodierung ISO 8859-2.

                Diese Zeiten sind lange vorbei. Der Unicode-Zeichensatz lässt sich mit verschiedenen Zeichencodierungen codieren: UTF-8, UTF-16, UTF-32.

                Was soll denn der „UTF-8-Zeichensatz“ sein? Wie unterscheidet er sich vom „UTF-16-Zeichensatz“?

                Daran sollte deutlich werden, dass diese Bezeichnungen unsinnig sind. Nur der Begriff „Unicode-Zeichensatz“ ist treffend.

                Denn "Zeichensatz" ist auch treffender, weil man sich hierunter sehr gut eine tabellarische Anordnung der Zeichen zu einer Nummer vorstellen kann (was ja auch so stattfindet)

                Ja, genau das ist beim codierten Zeichensatz der Fall.

                Das ist aber nur die halbe Miete. Es muss auch noch festgelegt werden, wie diese Nummern in Bytes codiert werden. Genau das tut die Zeichencodierung.

                Und deshalb trifft der Begriff „Zeichensatz“ daneben.

                Muss als nächstes erst mal jeder mit mindestens 4 Zeilen Allah preisen - oder gibt es Stockhiebe, wenn jemand zu den 5 festgelegten Gebetszeiten antwortet?

                Jetzt willst du die Diskussion ins Lächerliche ziehen?

                Kann man nicht Günni wieder auferstehen lassen, damit du jemanden zum Abreagieren hast?

                Qapla'

                --
                „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                1. ich betrachtes es als Ahnungslosigkeit des Autors.
                  Dann wären also alle dumm und machen das falsch
                  „Dumm ist, wer Dummes tut.“
                  Kann man nicht Günni wieder auferstehen lassen, damit du jemanden zum Abreagieren hast?

                  Ich glaube, den hättest Du sehr viel nötiger. Jemanden zum Abreagieren meine ich - denn Du versuchst genau das gerade bei mir.

                  Hier den "Günni" auferstehen lassen zu wollen (ein kriminelles Arschloch, dass viele geschädigt hat) passt zu Deinem auch sonst unangemessenen Verhalten. Was Du in diesem Thread betreibst ist Rechthaberei und Prinzipienreiterei - eine oft als unangenehm angesehene Vorgehenweise.

                  Fürs nächste Mal: Wenn Dir jemand auf eine Deiner gelegentlich ziemlich oberlehrerhaften Belehrungen in einer Weise antwortet wie "Ist mir offen gestanden egal. Betrachte es als SEO-Maßnahme, wenn ich [von was auch immer] schreibe" - dann ziehe in Erwägung, dass derjenige, nach dem er schon sehr deutlich ausdrückte dass er die Diskussion damit auf eine für beide Seiten gesichtswahrende Weise beendet haben will, aus der Haut fahren wird wenn Du diesem in unsachlicher Weise auch noch "Ahnungslosigkeit" an den Kopf wirfst.

                  Hast Du das jetzt verstanden? Wenn nicht dann frag oder nimm ein Kommunikationstraining. Weise im letzten Fall den Trainer darauf hin, worin genau Du Fertigkeiten entwickeln willst.

                  Jörg Reinholz

                  1. @@Jörg Reinholz:

                    nuqneH

                    Hier den "Günni" auferstehen lassen zu wollen (ein kriminelles Arschloch, dass viele geschädigt hat)

                    Mir war nicht bewusst, dass er dich so tief getroffen hat, dass du immer noch nicht drüber hinweg bist. Da war der Spaß darüber wohl unangebracht.

                    wenn Du diesem in unsachlicher Weise auch noch "Ahnungslosigkeit" an den Kopf wirfst.

                    Ich habe etliche sachliche Argumente angeführt (auf die du in keinster Weise eingegangen bist), von Unsachlichkeit kann wohl nicht die Rede sein.

                    Und ich habe auch nicht gesagt, dass du ahnungslos WÄRST, sondern dass dein Artikel auf mich so WIRKT.

                    Bei jemandem, der grundlegende Begriffe durcheinanderwirft, erwarte ich kein fundiertes Wissen zum Thema. Die Wahrscheinlichkeit ist hoch, dass ich solch einen Artikel nach den ersten paar Sätzen nicht weiterlese.

                    Du schreibst doch aber, damit andere deine Artikel ernstnehmen. Es liegt an dir, ihnen dies zu ermöglichen.

                    Qapla'

                    --
                    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                    1. Hier den "Günni" auferstehen lassen zu wollen (ein kriminelles Arschloch, dass viele geschädigt hat)
                      Mir war nicht bewusst, dass er dich so tief getroffen hat

                      Der hat sich einfach erschossen bevor ich richtig fertig  mit ihm war. Wenigstens war er danach keine Gefahr mehr für die Gesellschaft.

                      wenn Du diesem in unsachlicher Weise auch noch "Ahnungslosigkeit" an den Kopf wirfst.

                      Ich habe etliche sachliche Argumente angeführt (auf die du in keinster Weise eingegangen bist), von Unsachlichkeit kann wohl nicht die Rede sein.

                      Dazu unten das wörtliche Zitat:

                      Und ich habe auch nicht gesagt, dass du ahnungslos WÄRST, sondern dass dein Artikel auf mich so WIRKT.

                      Dann solltest Du aber besonders hart an Deiner Formulierung arbeiten:

                      "Nein, ich betrachtes es als Ahnungslosigkeit des Autors. Einen Fachartikel, der grundlegende Begriffe falsch verwendet, kann ich nicht ernst nehmen. Das zeugt davon, dass der Autor nicht weiß, wovon er spricht."

                      Für zufällig hereinstolpernde: Es ging um die Begriffe "Zeichensatz" (habe ich verwendet) und "Kodierung" Von letzrem meint der Gunnar, das wäre der einzig richtige, wer "Zeichensatz" verwendet sei ahnungslos, wisse nicht wovon er spricht und sei nicht ernst zu nehmen.

                      Ich bin unabrückbar der Meinung, das ersichtliche Verhalten ist unangemessen, oberlehrerhaft und zudem auch beleidigend.

                      Nochmal: "unabrückbar".

                      Jörg Reinholz

              3. Om nah hoo pez nyeetz, Jörg Reinholz!

                Du meinst also, "Zeichensatz" sei falsch?

                Ich habe einen Brotbackautomaten. Damit kann ich helles Brot, dunkles Brot, Kuchenteig und Marmelade zubereiten. Das wären die Zeichen des Zeichensatzes. Die Zeichenkodierung wäre nun die Programmsteuerung des Automaten.

                Matthias

                --
                1/z ist kein Blatt Papier.

              4. Hallo,

                Du meinst also, "Zeichensatz" sei falsch?

                Hm. Im HTTP-Header schreibt man: "Content-Type: text/html; charset=UTF-8".
                Hm. Im Mail-Header schreibt man: "Content-Type: text/plain; charset=UTF-8".

                Die falsche Verwendung der Begriffe ist historisch gewachsen, den Autoren von HTTP 1.1 ist auch schon aufgefallen, dass es falsch ist, wenn ich mal aus dem RFC Abschnitt 3.4 zitieren darf:

                Note: This use of the term "character set" is more commonly
                     referred to as a "character encoding." However, since HTTP and
                     MIME share the same registry, it is important that the terminology
                     also be shared.

                Jörg Reinholz

                martachen

    2. @@Michi:

      nuqneH

      htmlentities($_POST['ort'], ENT_HTML401, "ISO-8859-1")

      htmlentities() ist eine der vielen unnützen Funktionen in PHP. Nicht verwenden.

      dann kann ich mir auch das vorherige Umwandeln der Umlaute gegen &auml; etc. ersparen!

      Ja, das sollte man sich generell sparen.

      Qapla'

      --
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
  2. Hallo,

    Ich habe ein Formular, wenn es durchläuft werden die Daten nochmlas ausgegeben, das mache ich dann mit:
    htmlspecialchars($_POST['ort'])

    das ist in Ordnung so.

    jetzt ist mir aufgefallen, das Wörter mit deutschen Umlauten nicht ausgegeben werden, obwohl sie aber in der Variable sind.

    Nicht ausgegeben?? Du meinst vermutlich, dass die Umlaute _nicht_korrekt_ ausgegeben werden.
    Okay. Du hast also ein Problem mit der Zeichencodierung, bzw. mit unterschiedlichen Zeichencodierungen.

    Dann wollte ich das so korrigieren, das ich vorher in den Variablen die Umlaute gegen &auml; etc. ersetze.

    Wozu der Unfug? Das mag zwar die Darstellung der Umlaute korrigieren, kuriert aber nur die Symptome, nicht die Ursache.
    Nutze überall die gleiche Zeichencodierung (UTF-8 wäre keine schlechte Wahl) und gib sie auch überall korrekt an - vor allem im HTTP-Header, ersatzweise auch noch im meta-Element im Dokument.

    Ciao,
     Martin

    --
    Wer schläft, sündigt nicht.
    Wer vorher sündigt, schläft besser.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Das heist ich habe es mir viel zu kompliziert gemacht, ein simples

      charset=UTF-8"

      im HTML Kopf und alles Probleme gelösst?

      Na toll

      Michi

      1. Hallo,

        Das heist ich habe es mir viel zu kompliziert gemacht, ein simples

        charset=UTF-8"

        im HTML Kopf und alles Probleme gelösst?

        wenn du wirklich UTF-8 verwendest, möglicherweise schon. Ich habe allerdings nicht aus Spaß den HTTP-Header erwähnt - nur wenn dort keine Angabe zur Codierung gemacht wird, ist die Angabe im Dokument überhaupt relevant. Der HTTP-Header hat auf jeden Fall die höhere Priorität.

        Sorge also dafür, dass dein Server die richtige Codierung im Content-Type-Header angibt; wenn du keinen Einfluss auf die Serverkonfiguration hast, dann zur Not auch, indem du den korrekten Header mit PHP ausgibst.

        So long,
         Martin

        --
        Verliebt:    Er spricht, sie lauscht.
        Verlobt:     Sie spricht, er lauscht.
        Verheiratet: Beide sprechen, und die Nachbarn lauschen.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(