Worte mit Umlauten werden nicht angezeigt

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Worte mit Umlauten werden nicht angezeigt

    Hallöchen,
    ich habe die Tage festgestellt das Worte mit Umlauten wie ä,ü,ö garnicht mehr angezeigt werden.

    Diese Strings kommen aus Text-Dateien und werden per
    PHP-Code:
    echo htmlentities($variable); 
    ausgeben.

    Eigentlich sind es *.php Dateien in denen Arrays abgelegt sind, wo diese Strings drin stehen.

    Auf dem Server läuft:
    PHP Version 5.5.9-1ubuntu4.9


    Jemand eine Idee woran das aufeinmal liegen könnte?
    Denn vor ca. 1 Monat gab es das Problem nicht.


    Danke im Vorraus für euren Input.


    Gruss WW

  • #2
    Deine Textdateien sind vermutlich nicht in UTF-8 kodiert.

    Deine Anwendung sollte intern UTF-8 nutzen und auch UTF-8 ausgeben.

    Für mehr Infos siehe zum Beispiel hier:

    - UTF-8 - PHP Forum: phpforum.de

    Du solltest zudem htmlspecialchars verwenden. htmlentities ist in der Regel nicht die passende Lösung (und verdeckt mitunter Probleme mit falschen Charsets). Achte in dem Zusammenhang darauf, dass du deine Seiten mit dem passenden Charset-Header auslieferst. Siehe speziell dazu:

    - FAQ - Häufig gestellte Fragen aus dem Themenbereich des Forums PHP.de Wissenssammlung

    Faustregel: Du musst in der (PHP-)Programmierung immer wissen, welches Encoding/Charset du wo nutzt. Das schließt etwa Eingaben/Datenhaltung (zum Beispiel Textdateien, DBMS), Quellcodedateien und den Charset-Header (das ist NICHT das meta-Element im HTML-Code) der HTTP-Response mit ein.

    Die meines Erachtens sinnvollste Durchführung des Kontextwechsels nach HTML ist diese:

    PHP-Code:
    htmlspecialchars($theStringENT_QUOTES ENT_HTML5 ENT_DISALLOWED ENT_SUBSTITUTE'UTF-8'); 
    Hintergründe: https://nikic.github.io/2012/01/28/h...n-PHP-5-4.html

    Da es keinen Spaß macht, das ständig runterzutippen, bietet es sich natürlich an, diesen Aufruf in irgendeiner Form zu verkürzen. Zum Beispiel über eine Wrapper-Funktion:

    PHP-Code:
    function escape($s)
    {
        return 
    htmlspecialchars($sENT_QUOTES ENT_HTML5 ENT_DISALLOWED ENT_SUBSTITUTE'UTF-8');

    Oder natürlich über irgendeine View-Logik oder Template-Engine oder dergleichen.
    Zuletzt geändert von mermshaus; 09.07.2015, 04:36.

    Kommentar


    • #3
      Hallöchen mermshaus und Danke für deine Hilfestellung.

      Deine Anregungen und Links sind mir willkommen und werde mich da mal durcharbeiten.

      Was mich dennoch wundert:
      1. Das Problem tauchte aufeinmal auf (ca. 1 Monat)
      2. Es wurde an den Scripten nichts verändert

      Ich hab mal auf meinem lokalen XAMP diese Scripte aufgerufen und siehe da:
      Dort auch fehlerhafte Umlaute, obwohl auch dort nichts seit Monaten verändert wurde.

      Dann hab ich ein Uralt-Script ( ca. von 2012) aufgerufen:
      Dort werden die Umlaute korrekt dargestellt.

      Btw: Mein Entwicklungspramm (PS-PAD Editor) nutzte ich seit ca 5 Jahren mit dem Zeichensatz: UNICODE

      Zum Hintergrund:
      Ich habe Nicknamen/Pseudos in denen deutsche Umlaute und auch < oder > oder ß oder + oder - usw haben.

      Deshalb nutze ich bei der Ausgabe: htmlentities.

      Ich werde deine Funktion testen, und berichte dann neu.

      Gruss WW

      Kommentar


      • #4
        Zitat von Wasser_Wanderer Beitrag anzeigen
        Hallöchen mermshaus und Danke für deine Hilfestellung.

        Deine Anregungen und Links sind mir willkommen und werde mich da mal durcharbeiten.

        Was mich dennoch wundert:
        1. Das Problem tauchte aufeinmal auf (ca. 1 Monat)
        2. Es wurde an den Scripten nichts verändert
        Das liegt wohl daran, dass du nirgendwo die Zeichenkodierung festlegst, sondern du dich auf dein Glück verlässt, dass der Server zufällig die Zeichenkodierung per Default verwendet, die du gerne hättest. Wenn am Server aus welchen Gründen auch immer der Default-Wert verändert wird, funktioniert dein Script nicht mehr korrekt.

        Mit anderen Worten: Du spielst russisches Roulette und wunderst dich, wenn sich mal ein Schuss löst.

        Zitat von Wasser_Wanderer Beitrag anzeigen
        Ich habe Nicknamen/Pseudos in denen deutsche Umlaute und auch < oder > oder ß oder + oder - usw haben.

        Deshalb nutze ich bei der Ausgabe: htmlentities.
        htmlentities() ist Quatsch. Es gibt fast keinen Einsatzzweck dafür. Die korrekte Funktion für Maskierung von HTML-Sonderzeichen ist htmlspecialchars(). Und bei beiden Funktionen sollte nicht der dritte Parameter (die Zeichenkodierung) vergessen werden, ansonsten spielst du, wie bereits gesagt, Roulette.

        Kommentar


        • #5
          Hallo h3ll,
          auch dir danke für deine Hilfe.

          Wenn ihr euch den Quellcode der Seite ansehen wollt:
          Billard-Liga - 8-Ball - Liga 1

          Der Name: böser cowboy ist komplett weg.

          Der Zeichensatz ist:
          <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

          In Zeile: 2573 steht dieser Name im Href drinne (ohne htmlentities davor)

          Vllt hilft es bei der Fehlersuch

          Gruss WW

          Kommentar


          • #6
            Das HTML-Dokument hat 1422 Fehler. Diese solltest du beseitigen:

            https://validator.w3.org/check?uri=h...Inline&group=0

            Elementar dürfte folgender Fehler sein:

            "No Character Encoding Found! Falling back to windows-1252."

            Was meine Vermtung noch mehr bekräftigt: Du gibst keine Zeichenkodierung an und verlässt dich auf dein Glück, dass es schon irgendwie funktionieren wird.

            Der Zeichensatz ist:
            <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
            Den Meta-Tag kannst du vergessen. Wichtig ist welche Kodierung im HTTP-Header angegeben wurde.

            Kommentar


            • #7
              Hallo h3ll,
              lieben Dank für deine Hilfen.

              Bitte nicht böse sein wenn ich es noch nicht richtig verstehe:

              Sollte ich das HTML-Document so beginnen:
              <!DOCTYPE html>
              <html lang="de">
              <head>
              <meta charset="utf-8"/>

              oder so:

              <!DOCTYPE html>
              <html lang="de">
              <head>
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

              Lieben Gruss WW

              P.S.
              Ich hab mir mal diese Beschreibung angesehen gerade:
              http://webbausteine.de/blog/tipps/sc...darstellen.php
              Zuletzt geändert von Wasser_Wanderer; 14.07.2015, 16:31. Grund: Link einefügt

              Kommentar


              • #8
                Zitat von Wasser_Wanderer Beitrag anzeigen
                Hallo h3ll,
                lieben Dank für deine Hilfen.

                Bitte nicht böse sein wenn ich es noch nicht richtig verstehe:

                Sollte ich das HTML-Document so beginnen:
                <!DOCTYPE html>
                <html lang="de">
                <head>
                <meta charset="utf-8"/>

                oder so:

                <!DOCTYPE html>
                <html lang="de">
                <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

                Lieben Gruss WW

                P.S.
                Ich hab mir mal diese Beschreibung angesehen gerade:
                Zeichenkodierung - Schriftzeichen richtig darstellen - Webbausteine.de
                Vergiss den Meta-Tag! Der wird vom Browser eh ignoriert.

                Setze die richtige Kodierung im HTTP-Header:
                PHP-Code:
                header('Content-Type: text/html; charset=utf-8'); 

                Kommentar


                • #9
                  Ergänzend ...

                  Zitat von Wasser_Wanderer Beitrag anzeigen
                  Sollte ich das HTML-Document so beginnen:
                  <!DOCTYPE html>
                  <html lang="de">
                  <head>
                  <meta charset="utf-8"/>
                  Das lang-Attribut hat keinen Einfluss auf die Kodierung. Es hilft also bei deinem Problem nicht weiter.

                  oder so:

                  <!DOCTYPE html>
                  <html lang="de">
                  <head>
                  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
                  Meta-Tags mit "http-equiv" sind eine Krücke aus grauer Vorzeit. Damals, als Webbrowser noch mit Muskelkraft betrieben wurden, konnte man so einen Webserver veranlassen, entsprechende HTTP-Header zu senden.

                  Heute ist das allenfalls von Nutzen, wenn ein HTML-Dokument als Datei auf deiner Festplatte rumliegt. Ein Anzeigeprogramm (nicht zwingend ein Webbrowser) kann, wenn es keine anderen Hinweise auf die Kodierung findet, diese Angaben als Empfehlung betrachten. Das machen aber die wenigsten HTML-Anzeige-Programme.

                  Wenn ihr euch den Quellcode der Seite ansehen wollt:
                  Billard-Liga - 8-Ball - Liga 1
                  Dein HTML ist total kaputt. Du machst Textausgaben vor dem Start des html-Elements. In so einem Fall dürfte der Browser in den "Quirks-Mode" zurückfallen. Da kann man kein determiniertes Verhalten erwarten. Sprich: Du kannst nicht steuern, was der Browser wie darstellt.

                  Es werden auch keinerlei HTTP-Header gesendet, die eine Kodierungs-Anweisung beinhalten. Dafür jede Menge Cache-Voodoo und ein Expires-Header, der zurück ins Jahr 1981 verweist ... Du solltest froh sein, dass dein Webbrowser überhaupt etwas anzeigt, statt sich mit einer Fehlermeldung zur Wehr zu setzen.

                  Der Name: böser cowboy ist komplett weg.
                  Die Zeichenfolge taucht mehrfach im Quelltext auf. Besonders an Stellen, wo sie so (unkodiert) nicht hingehört: in onClick-Attributen und Ankern.

                  Im Klartext ist sie dagegen nicht zu finden. Das heißt: Schon das erzeugende PHP-Script muss den Text "verschluckt" haben. Finde zuerst die Stelle im Script, die den Text ausgeben sollte, bevor du dich mit den Feinheiten der HTML-Dokumentstruktur befasst.
                  Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                  Kommentar


                  • #10
                    Die sinnvollste Option für ein PHP-Script ist es wohl tatsächlich, <meta charset="utf-8"> zu setzen (und zwar früh im Dokument (Response-Body natürlich), in den ersten 1024 Bytes) und zusätzlich den Content-Type-HTTP-Header zu setzen/zu überschreiben und auf sonstige Scherze (BOM) zu verzichten.

                    PHP-Code:
                    header('Content-Type: text/html; charset=UTF-8'); 
                    Details hier: Angabe der Zeichencodierung in HTML (Ich meine im Zweifel die englische Version der Seite. Offenbar wird man da unbemerkt auf die deutsche umgeleitet, wenn man Accept-Language-Header mitschickt oder so. Als wäre das nicht alles schon kompliziert genug, weil alle paar Jahre der Inhalt geändert wird…)



                    PS: Auf der W3C-Seite steht zwar, dass es einen gewissen Sinn ergibt, den HTTP-Header komplett wegzulassen, aber ich würde den Header im PHP-Code aus pragmatischen Gründen dennoch setzen, da so erstens eine möglicherweise „falsche“ Server-Konfiguration überschrieben werden könnte, da zweitens vielleicht nicht jeder Client meta.charset versteht und da ich drittens vermute, dass die Verarbeitung des Dokuments für den Client dadurch geringfügig erleichtert wird.
                    Zuletzt geändert von mermshaus; 16.07.2015, 17:29.

                    Kommentar


                    • #11
                      Zunächst meinen herzlichen Dank an Alle die sich mit diesem Thema befasst haben, und wertvolle Hilfestellungen gegeben haben.

                      Soweit ich vom (privaten) Betreiber der Seite erfahren habe, stammt die Basis-Programmierung aus dem Jahr 2005 oder 2006.
                      Und das hat der Betreiber auch nur "geerbt".

                      Manche zusätzliche PHP-Funktionen sind über die Jahre dazugekommen. Und diese auch nur by learning by doing.

                      Das da ganz bestimmt verflucht viele Fehler drinne sind, bestätigen Eure Kommentare

                      Ich denke das da noch ne Menge Arbeit auf mich zukommt. Aber ihr habt mir ja schon gute Hinweise gegeben.
                      Vielen Dank dafür.

                      Gruß WW

                      Kommentar


                      • #12
                        Zitat von mermshaus Beitrag anzeigen
                        Da es keinen Spaß macht, das ständig runterzutippen, bietet es sich natürlich an, diesen Aufruf in irgendeiner Form zu verkürzen. Zum Beispiel über eine Wrapper-Funktion:

                        PHP-Code:
                        function escape($s)
                        {
                            return 
                        htmlspecialchars($sENT_QUOTES ENT_HTML5 ENT_DISALLOWED ENT_SUBSTITUTE'UTF-8');

                        Oder natürlich über irgendeine View-Logik oder Template-Engine oder dergleichen.
                        Ich habe deine vorgeschlagene ausprobiert.
                        Leider erhalte ich eine Notice, das zb ENT_QUOTES als Konstante erwartet wurde.
                        Wenn ich es in Single-Quotes bzw Double-Quotes setze, dann gibs Warnings.

                        Wie ginge es ohne Fehlermeldungen?

                        Gruss WW

                        Kommentar


                        • #13
                          Bitte Fehlermeldungen im Wortlaut zitieren, so dass wir erkennen können, was wirklich Sache ist.
                          I don't believe in rebirth. Actually, I never did in my whole lives.

                          Kommentar


                          • #14
                            Ergänzend:

                            Zitat von Wasser_Wanderer Beitrag anzeigen
                            Ich habe deine vorgeschlagene ausprobiert.
                            Leider erhalte ich eine Notice, das zb ENT_QUOTES als Konstante erwartet wurde.
                            Wenn ich es in Single-Quotes bzw Double-Quotes setze, dann gibs Warnings.

                            Wie ginge es ohne Fehlermeldungen?
                            Die Konstanten, die du htmlspecialchars() mitgeben kannst, sind allesamt Ganzzahlen (Integers, so genannte Flags). Sie in Hochkommas zu setzen, macht aus ihnen Zeichenketten (Strings) und das wäre Unsinn. Verwende sie so, wie von mermshaus angegeben, dann gibts an dieser Stelle keine Fehlermeldungen. ENT_QUOTES ist so alt, das kennt jede halbwegs aktuelle PHP-Version. Die anderen sind etwas neuer, die gibts erst seit PHP 5.4. Da du mit 5.5.9 arbeitest, dürfte das auch nicht die Ursache der Fehlermeldung sein. Irgendwelche Späße mit Namensräumen schließe ich mal aus, weil dein Code soetwas noch nicht kennt.

                            Eine vollständige Fehlermeldung (alle Meldungen, wenn es mehrere sind) sowie die entsprechenden Code-Teilstücke wären sehr hilfreich.
                            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                            Kommentar


                            • #15
                              Hallöchen,

                              hier die Fehlermeldungen:
                              PHP-Code:
                              Notice: Use of undefined constant ENT_HTML5 assumed 'ENT_HTML5' in \index.php on line  54

                              Notice
                              : Use of undefined constant ENT_DISALLOWED assumed  'ENT_DISALLOWED' in \index.php on line  54

                              Notice
                              : Use of undefined constant ENT_SUBSTITUTE assumed  'ENT_SUBSTITUTE' in \index.php on line  54 
                              Und so wird die Funktion ausgeführt, in einer Foreach-Schleife:
                              PHP-Code:
                              <td colspan=\"3\" bgcolor=\"".$ergtab."\" height=\"25\"><b style=\"color:".$ergtab2."\">".codierung($spieler)."</b></td> 
                              So ist die Funktion geschrieben:
                              PHP-Code:
                              function codierung($s)
                              {
                                  return 
                              htmlspecialchars($sENT_QUOTES ENT_HTML5 ENT_DISALLOWED ENT_SUBSTITUTE'UTF-8');

                              Grüsse WW

                              Edit:
                              Ich Depp !!!!!!
                              Ich musste ja nur die ENT_HTML5, ENT_DISALLOWED und ENT_SUBSTITUTE in Single-Quotes setzen
                              Zuletzt geändert von Wasser_Wanderer; 23.07.2015, 20:08. Grund: Zu blöde die Fehlermeldung richtig zu lesen

                              Kommentar

                              Lädt...
                              X