Ankündigung

Einklappen
Keine Ankündigung bisher.

Nach Umstieg auf PHP 7 + Abstimmung von charset werden Umlaute als ? angezeigt

Einklappen

Neue Werbung 2019

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

  • Nach Umstieg auf PHP 7 + Abstimmung von charset werden Umlaute als ? angezeigt

    Ich weiß im Augeblick nicht mehr weiter.

    Gestern bin ich auf einem neuen Server von einer Version 5.x auf die Version PHP 7.0.8-0ubuntu0.16.04.3 mit der gesamten Homepage umgezogen. Am liebsten hätte ich dabei direkt alle Skripte und die Datenbank samt Daten auf utf-8 umgestellt. Aber neben dem enormen Aufwand gäbe das auch erhebliche Abstimmungsaufwände mit der Warenwirtschaft und anderen Schnittstellen. Es blieb also alles beim Alten, wurde nur umkopiert und die notwendigen Ersetzungen durchgeführt, z.B. mySQL zu mySQLi. Skripte haben weiterhin das Ansi-Format. Daten in der Datenbank sind westlich (latin1). Vorerst. Bis zum großen Relaunch.

    Natürlich habe ich darauf geachtet, dass das lokale Charset sowohl in php.ini (bzw. .htaccess) als auch auf den Ausgabeseiten auf ISO-8859-1 gesetzt wurde. Sogar das globale Charset habe ich temporär auf ISO-8859-1 gesetzt. phpinfo() zeigt es entsprechend an.

    Doch alle Umlaute, sowohl aus der Datenbank als auch Texte in den PHP-Seiten selbst, werden leider immer noch nun als Fragezeichen ausgegeben. utf-8 lässt irgendwo grüßen. Tests ergaben, dass Dateien, sobald sie im utf-8 Format abgespeichert wurden, korrekt angezeigt werden konnten. "Frühe Vögel gähnen!" wird korrekt ausgegeben, wenn es entweder im Format utf-8(bom) abgespeichert wird oder als ansi und dann codiert (Ã?bergänge sind höchst mäÃ?ig). "Frühe Vögel gähnen!" als ansi ergibt dagegen "Fr?he V?gel g?hnen!". Ändere ich das Postfix der ansi-Datei von .php auf .html, werden die Umlaute im Browser sofort korrekt ausgegeben.

    Was muss ich noch beachten? Was habe ich übersehen?

  • #2
    Die Datenbankverbindung auf latin1 gestellt?

    Übrigens auch beachten: latin1 ist NICHT iso-8859-1. Diese unterscheiden sich im Detail. Das Problem ist aber, dass MySQL kein iso-8859-1 kann.

    Und was ist das für ein Warenwirtschaftssystem, das nicht mal €-Zeichen unterstützt? Denn € ist in ISO-8859-1 nicht enthalten.

    Kommentar


    • #3
      Doch alle Umlaute, sowohl aus der Datenbank als auch Texte in den PHP-Seiten selbst, werden leider immer noch nun als Fragezeichen ausgegeben. utf-8 lässt irgendwo grüßen.
      Schau mal ob du diese Punkte alle bedacht hast .. in Bezug auf einen Charset halt: https://php-de.github.io/jumpto/utf-8/#konsequent-utf-8
      The string "()()" is not palindrom but the String "())(" is.

      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Schau dir mal den HTTP-Response Header an. Der könnte vom Server immer UTF-8 liefern, dann hast du das beschriebene Problem auch.
        Siehe auch https://www.w3.org/International/que...ess-charset.de

        Kommentar


        • #5
          Danke. Gerade der Hinweis auf den Header klang absolut plausibel. Die anderen Punkte habe ich erledigt gehabt. Mache den Job nun doch schon gute 20 Jahre.

          Lösung war jedoch eine andere und daher interessant: "php_value output_handler mb_output_handler" stand in den lokalen .htaccess-Dateien. Nach Auskommentieren dieser Zeile wurden die Umlaute angezeigt. Php.net sagt dazu: mb_output_handler() converts characters in the output buffer from internal character encoding to HTTP output character encoding. Somit wäre nur noch die Frage zu klären und nur interessenhalber oder für die Zukunft denn wir benötigen diesen Wert derzeit gar nicht: wo wird festgelegt welchen Charset das HTTP output character encoding benutzen soll? In der php.ini fand ich kein einziges utf-8-Vorkommen.

          Kommentar


          • #6
            Du kannst mal diesen Code im Root laufen lassen, um alles zu checken
            PHP-Code:
            <?php
            ob_start
            ();
            // to check chars uncomment next line
            //header('Content-Type: text/html; charset=UTF-8');
            $link mysqli_connect("localhost""root""""test");
            $charset ='';
            if (!
            $link) {
                
            $charset "Connect failed";
            }else{
                
            $charset mysqli_character_set_name($link);
            }
            //close connection
            mysqli_close($link);

            echo 
            'PHP Version :' phpversion() . "<br>\n";
            echo 
            'Charset to connect DB : ' $charset "<br>\n";
            echo 
            'php ini default_charset            : ' ini_get('default_charset') . "<br>\n";
            echo 
            '(used by htmlspecialchars and iconv)' "<br><br>\n\n";
            echo 
            'php ini internal_encoding          : ' ini_get('internal_encoding') . "<br>\n";
            echo 
            "php ini output_encoding            : " ini_get('output_encoding') . "<br>";
            echo 
            "mb_http_output                     : " mb_http_output() . "<br><br>\n";
            echo 
            "check chars: if öäü and Euro symbol -> € are correct chars then server
            output is ok,<br>
            else change header in line 4."
            ;
            echo 
            '<h3>Response Header settings<h3>';
            echo 
            "<pre>";
            print_r(headers_list());
            echo 
            "</pre>";
            if ( 
            file_exists("../.htaccess") || file_exists(".htaccess") ) {
                echo 
            "see .htaccess file";
                
            //readfile("../.htaccess");
            }
            ob_end_flush();
            Vielleicht fällt einem noch was ein, was man noch checken könnte. Das würde die Arbeit zukünftig hier erleichtern nehme ich an.

            Kommentar

            Lädt...
            X