Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] setlocal("de") + utf8 + strfttime Kodierungs problem

Einklappen

Neue Werbung 2019

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

  • [Erledigt] setlocal("de") + utf8 + strfttime Kodierungs problem

    Hallo Zusammen!

    Ich stehe vor einem Problem mit der Kodierung von UTF-8 auf verschiedenen Server.

    Am Anfang meines PHP Scripts mach ich folgendes:
    PHP-Code:
    if (strtoupper(substr(PHP_OS03)) === 'WIN')
    {
        
    setlocale(LC_ALL"deu");
    }
    else
    {
        
    setlocale(LC_ALL'de_DE.UTF-8');

    Mein HTML Startingtag schaut so aus:
    HTML-Code:
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            ....
    Soweit so gut, das funktioniert auch prima. Mein Problem ist jetzt folgendes. Ich versuche mittels strfttime die Monatsnamens eines Zeitstempels in Deutsch auszugeben.

    Das mache ich so:
    PHP-Code:
    $date DateTime::createFromFormat('Y-m-d'$a_acticle['date']);
    echo 
    utf8_encode(strtoupper(strftime("%d / %B / %Y /"$date->getTimestamp()))); 
    Diese Ausgabe funktioniert auf meiner Windows Dev Maschine ohne Probleme (Umlaut werden korrekt dargestellt), aber auf der Linux Maschine werden umlaute falsch Dargestellt (Komische Zeichen). Wenn ich aber jetzt die Funktion utf8_encode() wegschmeise bei der ausgabe, funktioniert der Output in Linux, aber nicht mehr in Windows.

    Ich hab bereits mittels mb_detect_encoding() versucht die coedierung vom rückgabewert strfttime() zu Prüfem mittels:
    PHP-Code:
    echo mb_detect_encoding(strftime("%d / %B / %Y /"$date->getTimestamp())); 
    Sowohl Linux als auch Windows gibt mir hier bereits UTF-8 zurück. Also eigentlich sollte ich die Funktion utf8_encoding() gar nicht nötig sein, allerdings funktionierts hald nicht auf windows.

    Ich habe bereits versucht die strtoupper mit mb_stritoupper zu ersetzen bzw. mb_http_output("UTF-8") auszugeben, aber auf keinen der Maschinen ändert sich was.

    Hat jemand eine Idee wie ich das Problem lösen kann oder wo der Fehler liegt?

    Danke!

  • #2
    Moinsen,

    Du kannst Dir die if-Abfrage bzgl. des Betriebssystems schon mal sparen. Seit PHP 4.3 kann setlocale() mehrere Locale Strings entgegen nehmen. Praktisch sieht das dann so aus:
    PHP-Code:
    setlocale(LC_ALL"deu""de_DE.UTF-8"); 
    Theoretisch kann ich mir vorstellen, dass Deine Windows Maschine auf einen nicht UTF8 Zeichensatz eingestellt ist. Möglich ist das. Genau so, wie es möglich ist eine Linux Maschine global mit einem bestimmten Zeichensatz zu versehen.

    Ich hatte jetzt auf meinem Windows System kein Problem die Umlaute richtig darzustellen.

    Kommentar


    • #3
      Zitat von ezkimo Beitrag anzeigen
      Moinsen,

      Du kannst Dir die if-Abfrage bzgl. des Betriebssystems schon mal sparen. Seit PHP 4.3 kann setlocale() mehrere Locale Strings entgegen nehmen. Praktisch sieht das dann so aus:
      PHP-Code:
      setlocale(LC_ALL"deu""de_DE.UTF-8"); 
      Theoretisch kann ich mir vorstellen, dass Deine Windows Maschine auf einen nicht UTF8 Zeichensatz eingestellt ist. Möglich ist das. Genau so, wie es möglich ist eine Linux Maschine global mit einem bestimmten Zeichensatz zu versehen.

      Ich hatte jetzt auf meinem Windows System kein Problem die Umlaute richtig darzustellen. (XAMPP)

      Kommentar


      • #4
        Zunächst mal würde ich einen entsprechenden Content-type-Header mit encoding-Angabe absetzen. Das scheint mir das eigentlich wichtige zu sein.

        Kommentar


        • #5
          Funktion strftime_deu_utf8

          Das Windows bei setlocale mit UTF-8 rumzickt, ist nicht so selten. So auch auf meiner lokalen Testumgebung unter Window. Der Returnwert von setlocale zeigt jedoch, was machbar ist. Die Funktion strftime_deu_utf8 sollte das Problem lösen:

          PHP-Code:
          /*
           * $format: See strftime
           * $date  : DateTime or Timestamp 
           */
          function strftime_deu_utf8($format,$date) {
              
          $loc setlocale(LC_TIME,"de_DE.UTF-8",'de_DE@euro',"deu");
              if(
          $date instanceof DateTime$date $date->getTimestamp();
              
          $strDate strftime($format$date);
              return 
          strpos(strtoupper($loc),'UTF') !== false $strDate utf8_encode($strDate);


          //Test 
          //Ausgabe: Montag, der 05. März 2012 

          $date date_create('2012-03-05');
          echo 
          strftime_deu_utf8("%A, der %d. %B  %Y",$date); 
          Getestet erst unter XAMPP/Win + 2 Linux-Systemen. Andere?

          LG jspit

          Kommentar


          • #6
            Zitat von nikosch Beitrag anzeigen
            Zunächst mal würde ich einen entsprechenden Content-type-Header mit encoding-Angabe absetzen. Das scheint mir das eigentlich wichtige zu sein.
            Hab ich ja bereits versucht:
            Ich habe bereits versucht die strtoupper mit mb_stritoupper zu ersetzen bzw. mb_http_output("UTF-8") auszugeben, aber auf keinen der Maschinen ändert sich was.
            bzw. hab ich versucht den Header manuel zu senden, ebenfalls ohne erfolg.


            Ich verwende auf meiner Win7 Dev Maschine auch XAMPP.

            @jspit
            Danke, ich werde die Funktion mal testen und dann bescheid geben, ob das mein Problem behoben hat.

            Kommentar


            • #7
              nein .. was nikosch meint, ist folgendes : du sollst dich nicht auf deinen Meta-Header im html verlassen, sondern per PHP einen RICHTIGEN HTTP-Header absetzen ( so, also ob du einen Download erzwingen willst von php aus... oder ein Bild per php erzeugen und darstellen willst ) -

              PHP-Code:
              <?php
              header
              ("Content-Type: text/html; charset=UTF-8");
              // evtl noch X-UA header für den IE nachschieben
              ?>
              <!DOCTYPE html>
              ... und so weiter

              Kommentar


              • #8
                Zitat von eagle275 Beitrag anzeigen
                nein .. was nikosch meint, ist folgendes : du sollst dich nicht auf deinen Meta-Header im html verlassen, sondern per PHP einen RICHTIGEN HTTP-Header absetzen ( so, also ob du einen Download erzwingen willst von php aus... oder ein Bild per php erzeugen und darstellen willst ) -

                PHP-Code:
                <?php
                header
                ("Content-Type: text/html; charset=UTF-8");
                // evtl noch X-UA header für den IE nachschieben
                ?>
                <!DOCTYPE html>
                ... und so weiter
                Ja, das weis ich

                Drum hab ich ja auch gesagt:
                bzw. hab ich versucht den Header manuel zu senden, ebenfalls ohne erfolg.
                Das hab ich alles schon versucht, ohne erfolg.

                Edit:
                Ach ja, meine Code-Dateien sind auch alle in UTF-8 gespeichert, also sollte das eigentlich auch nicht so das problem sein denke ich...

                Kommentar


                • #9
                  header "erneut" senden - endet im Normalfall in "headers already sent", wenn vorher schon html steht, wie in deinem Code-Schnipsel

                  Kommentar


                  • #10
                    Ich verwende output buffering. Auserdem hatte ich den header am anfang meines skripts geschickt. Aber wie gesagt da kams auch zu keiner änderung zw. Linux und Windows. Ich versuche die funktion von jspit heute abend. Vl klapts ja damit.

                    Kommentar


                    • #11
                      Hast Du die iconv Funktionen auch schon ausprobiert?

                      Kommentar


                      • #12
                        Zitat von jspit Beitrag anzeigen
                        PHP-Code:
                        /*
                         * $format: See strftime
                         * $date  : DateTime or Timestamp 
                         */
                        function strftime_deu_utf8($format,$date) {
                            
                        $loc setlocale(LC_TIME,"de_DE.UTF-8",'de_DE@euro',"deu");
                            if(
                        $date instanceof DateTime$date $date->getTimestamp();
                            
                        $strDate strftime($format$date);
                            return 
                        strpos(strtoupper($loc),'UTF') !== false $strDate utf8_encode($strDate);


                        //Test 
                        //Ausgabe: Montag, der 05. März 2012 

                        $date date_create('2012-03-05');
                        echo 
                        strftime_deu_utf8("%A, der %d. %B  %Y",$date); 
                        Danke, hat funktioniert super!

                        Kommentar

                        Lädt...
                        X