Linuchs: Zeichencodierung im Dokument wechseln?

Hallo,

ich bekomme für meine Seiten Inhalte geliefert, die nicht UTF-8 codiert sind. Also kann man die Umlaute nicht lesen.

Ich möchte jetzt nicht 150 Dateien einzeln bearbeiten und umstellen.

Kann man im UTF-8 Dokument einen Container auf ISO-8859-1 umstellen?

Linuchs

  1. Tach!

    Kann man im UTF-8 Dokument einen Container auf ISO-8859-1 umstellen?

    Nein.

    dedlfix.

  2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

    ich bekomme für meine Seiten Inhalte geliefert, die nicht UTF-8 codiert sind. Also kann man die Umlaute nicht lesen.

    Ich möchte jetzt nicht 150 Dateien einzeln bearbeiten und umstellen.

    Kann man im UTF-8 Dokument einen Container auf ISO-8859-1 umstellen?

    Du fügst die doch sowieso mit PHP zusammen. Da gibt es diverse Funktionnen, z.B. http://php.net/manual/en/function.utf8-decode.php

    und irgendwo schwirrt auch noch ein "seems_utf8()" rum im Archiv

    oder http://php.net/manual/de/function.mb-detect-encoding.php

    Spirituelle Grüße
    Euer Robert
    robert.r@online.de

    --
    Möge der wahre Forumsgeist ewig leben!
    1. Moin!

      und irgendwo schwirrt auch noch ein "seems_utf8()" rum im Archiv

      Ja. Basierend auf der damaligen Diskussion läuft bei mir folgendes zu meiner Zufriedenheit

        # Reihenfolge ist wichtig
        # eventuell erweitern...
        $spek=array('ASCII', 'UTF-16', 'UTF-8', 'ISO-8859-15', 'ISO-8859-1'); 
      
        $coding = mb_detect_encoding($string, $spek, false); 
      
        if ( 'UTF-8' != $coding && 'ASCII' != $coding ) {
          $string = "mb_convert_encoding($string, 'UTF-8', $coding);
        }
      

      Jörg Reinholz

      1. Lieber Jörg,

        Moin!

        und irgendwo schwirrt auch noch ein "seems_utf8()" rum im Archiv

        Ja. Basierend auf der damaligen Diskussion läuft bei mir folgendes zu meiner Zufriedenheit

          # Reihenfolge ist wichtig
          # eventuell erweitern...
          $spek=array('ASCII', 'UTF-16', 'UTF-8', 'ISO-8859-15', 'ISO-8859-1'); 
        
          $coding = mb_detect_encoding($string, $spek, false); 
        
          if ( 'UTF-8' != $coding && 'ASCII' != $coding ) {
            $string = "mb_convert_encoding($string, 'UTF-8', $coding);
          }
        

        Könntest Du bitte noch ein paar Worte darüber verlieren, warum diese Reihenfolge funktioniert, und warum Du das strict-Flag nicht benutzen willst bei der Erkennung?

        Spirituelle Grüße
        Euer Robert
        robert.r@online.de

        --
        Möge der wahre Forumsgeist ewig leben!
        1. Moin!

          Ja. Basierend auf der damaligen Diskussion läuft bei mir folgendes zu meiner Zufriedenheit

            # Reihenfolge ist wichtig
            # eventuell erweitern...
            $spek=array('ASCII', 'UTF-16', 'UTF-8', 'ISO-8859-15', 'ISO-8859-1'); 
          
            $coding = mb_detect_encoding($string, $spek, false); 
          
            if ( 'UTF-8' != $coding && 'ASCII' != $coding ) {
              $string = "mb_convert_encoding($string, 'UTF-8', $coding);
            }
          

          Könntest Du bitte noch ein paar Worte darüber verlieren, warum diese Reihenfolge funktioniert,

          Das hat Dedlfix schon sehr ausführlich getan.

          und warum Du das strict-Flag nicht benutzen willst bei der Erkennung?

          Der strict-Flag steht zum einen per default auf false. Zum anderen ist es aus Gründen der Anwendung (ich ruble die nicht immer sauberen Ausgaben von whois um / siehe "Telefónica Germany GmbH & Co. OHG") im konkreten Fall besser, auch im Fehlerfall (UTF-8 ist nicht valide) irgendein (falsches) Ergebnis zu bekommen als gar keins.

          Jörg Reinholz

    2. Du fügst die doch sowieso mit PHP zusammen.

      Nein, ich hole *.htm Dateien mit Javascript per Ajax und zeige sie an. Sowas:

      <p><b>Absatz 1</b></p>
      <p>Der letzte von zwei Absätzen.</p>
      

      Linuchs

      1. Hallo

        Nein, ich hole *.htm Dateien mit Javascript per Ajax und zeige sie an. Sowas:

        von wo? Von deiner Domain?

        Gruß Jürgen

      2. Nein, ich hole *.htm Dateien mit Javascript per Ajax und zeige sie an. Sowas:

        Und da gibts keine Möglichkeit das umzuwandeln? Eine Javascript Funktion hab ich so schnell nicht gefunden, aber man kann in AJAX ein Encoding angeben.

        1. Tach!

          Nein, ich hole *.htm Dateien mit Javascript per Ajax und zeige sie an. Sowas: Und da gibts keine Möglichkeit das umzuwandeln?

          Die Umwandlung nimmt der Browser vor, wenn er das Dokument gemäß der angegebenen Kodierung liest. Diese muss im Content-Type-Header von HTTP angegeben sein. Javascript selbst hat von Kodierung keine Ahnung, das arbeitet immer mit Zeichen, die es vom Browser vorgekaut gereicht bekommt. Deswegen gelten die üblichen Vorgehensweisen, wie man dem Browser die Kodierung von Dokumenten mitteilt.

          Das Problem bei Ajax ist, dass oftmals keine kompletten Dokumente übertragen werden und da auch keine meta-Elemente enthalten sind. Deswegen entfällt da die Möglichkeit, die Kodierung im Dokument ersatzweise anzugeben, wenn der Server keine Angabe macht. Der Server ist hier also in der Pflicht, die Angabe zu liefern. Ansonsten raten sich die Browser was zusammen und Javascript kann da nicht eingreifen.

          Eine Javascript Funktion hab ich so schnell nicht gefunden, aber man kann in AJAX ein Encoding angeben.

          Kann man? Mir ist kein Weg bekannt, den Browser für empfangene Daten in eine bestimmte Kodierung zu zwingen.

          dedlfix.

      3. Moin!

        Du fügst die doch sowieso mit PHP zusammen. Nein, ich hole *.htm Dateien mit Javascript per Ajax

        Linuchs trällert "Wenn der Topf aber nun ein Loch hat..."

        Was (zum Teufel!) hindert Dich die Dateien mit php möglichst schon beim Upload durch iconv zu jagen und UTF-8-kodiert abzulegen? Das hier erledigt das für alle Dateien im aktuellen Verzeichnis, die auf .htm enden (blind geschrieben, ungetestet, ohne abgefangene Fehler, nur ein Vorschlag):

          $dataDir='.';
        
          # Reihenfolge ist wichtig
          # eventuell erweitern...
          $spek=array('ASCII', 'UTF-16', 'UTF-8', 'ISO-8859-15', 'ISO-8859-1'); 
        
          $d = dir($dataDir);
          while (false !== ($entry = $d->read())) {
            if (
                $entry != '..'
             && $entry != '.' 
             && substr( $entry, 0, 3 ) != '.ht';
             && substr( $entry, -4, 4 ) == '.htm';
             && file_exists("$dataDir/$entry")
             && is_readable("$dataDir/$entry")
             && is_writable("$dataDir/$entry")
            ) {
                $string = file_get_contents($dataDir/$entry);
                $coding = mb_detect_encoding($string, $spek, false); 
                if ( 'UTF-8' != $coding && 'ASCII' != $coding ) {
                   $string = mb_convert_encoding($string, 'UTF-8', $coding);
                   file_put_contents($dataDir/$entry, $string);
                }
            }
         }
         $d->close();
        

        Jörg Reinholz

  3. Hallo,

    meiner Kenntnis nach ist das nicht möglich bzw. sinnvoll, da die gesamte Seite vom Editor in der passenden Zeichenkodierung gespeichert werden muss:

    http://webbausteine.de/blog/tipps/schriftzeichen_richtig_darstellen.php

    Gruss

    MrMurphy