StefanT42: Zeichensätze UTF8 oder Latin

Hallo zusammen,

mich beschäftig seit längerem die Frage ob man Webprojekte bzw. dessen Dateien ob nun für HTML, PHP Javascript etc. im UTF8 oder Latin Format abspeichern soll?! Dreamweaver8 z.B. ist Standartmäßig auf Latin eingestellt.

Ist der XHTML Standart nicht auf UTF8 festgelegt?

Des weiteren gab es schonmal Probleme mit MySQL 5 wenn Strings Eingabedaten aus Formularen nicht als UTF8 gespeichert werden sollen.

Ist es nicht an der Zeit für alles UTF-8 zu verwenden? Wie ist der Stand der Dinge?

Über bisschen Hilfe würde ich mich riesig freuen.

Vielleicht hat jemand auch einen interessanten Link hierzu.

Gruß,

Stefan

  1. mich beschäftig seit längerem die Frage ob man Webprojekte bzw. dessen Dateien ob nun für HTML, PHP Javascript etc. im UTF8 oder Latin Format abspeichern soll?! Dreamweaver8 z.B. ist Standartmäßig auf Latin eingestellt.

    dreamweaver ist ein fehler - du solltest die dateien als utf-8 ohne byte-order-mark speichern

    Ist der XHTML Standart nicht auf UTF8 festgelegt?

    nein - lediglich xml geht von uft-8 aus, wenn nichts anderes angegeben wird

    Ist es nicht an der Zeit für alles UTF-8 zu verwenden? Wie ist der Stand der Dinge?

    ja, es ist schon länger an der zeit ;)

    Vielleicht hat jemand auch einen interessanten Link hierzu.

    http://www.w3.org/International/questions/qa-changing-encoding

    1. Kann Suit nur zustimmen - UTF-8 und alles wird wunderbar :)

    2. Hallo und danke für die schnelle Arbeit.

      ja, es ist schon länger an der zeit ;)

      Aber PHP z.B. arbeitet doch in der StringFkt auf ANSI?!

      Hier z.B. raten die eher von UTF8 ab

      http://www.gerd-riesselmann.de/softwareentwicklung/php-und-utf-8-eine-anleitung-einleitung

      Arbeitet MySQL eigentlich per default mit UTF-8 ?

      1. Arbeitet MySQL eigentlich per default mit UTF-8 ?

        Nein, das ist das Problem - Standard ist Latin.

        Da hatte ich schon meine lieben Probleme *g* UTF-8 Code, UTF-8 Datenbank, aber der Wrapper, der es in die DB schreibt war immer noch Latin-8 *g* und ich wunder mich wie es in der DB ausschaut hehehe...

  2. Hallo Stefan,

    mich beschäftig seit längerem die Frage ob man Webprojekte bzw. dessen Dateien ob nun für HTML, PHP Javascript etc. im UTF8 oder Latin Format abspeichern soll?!

    leider finde ich den Beitrag nicht mehr, aber wahsage (ich vermisse ihn) hat mir hier mal gesagt, daß ich _immer_ utf-8 verwenden soll ... und dies auch hervorragend erklärt.

    Des weiteren gab es schonmal Probleme mit MySQL 5 wenn Strings Eingabedaten aus Formularen nicht als UTF8 gespeichert werden sollen.

    Wenn die Seite, auf der sich das Formular befindet, utf-8 codiert ist, die entsprechende Tabelle auf utf-8 eingestellt ist und das Formular mit

      
    <form action="/cgi-bin/auswertung.pl" method="post" accept-charset="utf-8">  
    
    

    eingeleitet wird, dütfte es eigentlich keine Probleme geben. Wenn Du dann natürlich _direkt_ zB. über phpmyadmin Daten eingibst, _kann_ es zu Problemen kommen.

    Vielleicht hat jemand auch einen interessanten Link hierzu.

    Gerne:

    Plädoyer für UTF-8
    Forum: utf-8 versus iso-8859-1 Vorteile <=>Nachteile
    WIKIPEDIA Artikel über utf-8
    UTF-8 und die Entity
    Warum UTF-8 nicht nur Zukunft, sondern bereits Gegenwart ist.
    Deutsche Umlaute und UTF-8
    The Properties and Promizes of UTF-8 (pdf)
    Zeichensätze ISO und UTF
    Links zum Thema Zeichensätze und Schrift

    Mit freundlichen Grüßen

    Professor Hase

    1. echo $begrüßung;

      Wenn die Seite, auf der sich das Formular befindet, utf-8 codiert ist,

      Es reicht nicht, einfach nur irgendeine Kodierung zu verwenden. Wichtig ist, dass man dem Empfänger mitteilt, welche Kodierung verwendet wurde. Dazu gibt es für HTTP die Zusatzangabe zum charset im Content-Type-Header. Als Ersatz gibt es im HTML eine Meta-Element-Angabe. Vorrang hat der HTTP-Header, doch lokal abgespeichert gibt es den nicht, sondern nur noch die Meta-Element-Angabe. Es ist also günstig, beides zu verwenden.

      die entsprechende Tabelle auf utf-8 eingestellt ist

      Wenn du damit die MySQL-Tabelle (mit MySQL ab Version 4.1) meinst, dann ist das im Prinzip unwichtig. Das ist, genauso wie die Angabe zur Kollation für die Datenbank, nur ein Default-Wert, der für neu hinzugefügte, untergeordnete Elemente herangezogen wird, wenn für diese nicht explizit etwas eingestellt wurde. Am Ende zählt allein die Kodierung des einzelnen Feldes. Es kann sogar für jedes Feld eine andere Kodierung eingestellt werden.

      Außerdem sollte bei der Kommunikation mit einem MySQL-Server eine Kodierung explizit ausgehandelt werden (mysql_set_charset() oder zur Not SET NAMES). Ansonsten kann es zu den von dir weiter unten angedeuteten Problemen kommen.

      und das Formular mit
      <form action="/cgi-bin/auswertung.pl" method="post" accept-charset="utf-8">

      Mir ist noch kein System begegnet, dass diese accept-charset-Angabe noch benötigt, wenn mindestens eins von beiden (HTTP-Header oder Meta-Element-Angabe) gesetzt ist.

      eingeleitet wird, dütfte es eigentlich keine Probleme geben. Wenn Du dann natürlich _direkt_ zB. über phpmyadmin Daten eingibst, _kann_ es zu Problemen kommen.

      Wenn man mit einer halbwegs aktuellen Version phpMyAdmin direkt Daten bearbeitet, gibt es keine Probleme. Der PMA hat seine Hausaufgaben gemacht und weiß, wie er richtig mit dem MySQL-Server zu reden hat. Problem ergeben sich nur dann, wenn auf anderen Wegen eine Kommunikation mit dem MySQL-Server stattfindet, bei der vergessen wurde, sich auf eine zu verwendende Kodierung zu einigen.

      echo "$verabschiedung $name";

      1. Hallo dedlfix,

        Es reicht nicht, einfach nur irgendeine Kodierung zu verwenden. Wichtig ist, dass man dem Empfänger mitteilt, welche Kodierung verwendet wurde.

        Genau das meinte ich ja damit, als ich sagte, die Seite muß utf-8 codiert sein.

        Dazu gibt es für HTTP die Zusatzangabe zum charset im Content-Type-Header. Als Ersatz gibt es im HTML eine Meta-Element-Angabe.

        <meta http-equiv="content-type" content="text/html; charset=utf-8" /> ist also nur _zweite_ Wahl? Kannst Du das mit dem Content-Type-Header bitte näher erklären? Ich habe jetzt versucht, mich schlau zu machen, habe die entsprechende WIKIPEDIA-Seite gelesen, aber ich verstehe es nicht. Ist das was, was ich mit der .htaccess beeinflussen kann?

        Was ich auch gefunden habe bei meinen 'Recherchen' ist der Hinweis, daß _jede_ php-Datei am Anfang folgendermaßen beginnen soll/muß:

          
        <?php  
        header("Content-type:text/html;charset=utf-8");  
        ?>  
        
        

        Meintest Du _das_ oder ist das _wieder_ was anderes? Und um mich ganz zu verwirren, habe ich auch wo gelesen, daß man über die php.ini was machen kann: default_charset = "utf-8"

        Hat das _auch_ damit zu tun oder ist _das_ jetzt wieder was völlig anderes? Du siehst, ich bin diesbezüglich die personifizierte Inkompetenz. :-) Übrigens wollte ich wissen, was da bei mir auf meinem Server von meinem Webspacehoster eingestellt ist und hab über phpinfo() entdeckt, daß bei 'default_charset' sowohl bei Local Value, als auch bei Master Value ein 'no value' steht.

        Vorrang hat der HTTP-Header, doch lokal abgespeichert gibt es den nicht, sondern nur noch die Meta-Element-Angabe. Es ist also günstig, beides zu verwenden.

        Ich dachte immer, das <meta http-equiv="content-type" content="text/html; charset=utf-8" /> reicht und ist auch das Einzige. OK, dann mache ich ab jetzt Beides. Nur wie? Was mich wieder zur Frage bringt, ob ich das mit der .htacess beeinflussen kann.

        Wenn du damit die MySQL-Tabelle (mit MySQL ab Version 4.1) meinst, dann ist das im Prinzip unwichtig. Das ist, genauso wie die Angabe zur Kollation für die Datenbank, nur ein Default-Wert, der für neu hinzugefügte, untergeordnete Elemente herangezogen wird, wenn für diese nicht explizit etwas eingestellt wurde.

        Ich meinte das, was unter phpMyAdmin für jeden Teil einer Tabelle unter "Kollation" eingestellt wird.

        Am Ende zählt allein die Kodierung des einzelnen Feldes. Es kann sogar für jedes Feld eine andere Kodierung eingestellt werden.

        Genau. Wir sprechen vom selben, oder?

        Außerdem sollte bei der Kommunikation mit einem MySQL-Server eine Kodierung explizit ausgehandelt werden (mysql_set_charset() oder zur Not SET NAMES).

        Auch diesbezüglich habe ich jetzt lange gegoogelt. Hab ich das richtig verstanden, daß ich das in jene Datei dazuschreibe, in der die Verbindung zum Server hergestellt wird? Diese Datei ist bei mir ausgelagert an eine Stelle vor dem Wurzelursprung meines Webspaces und würde _dann_ so aussehen:

          
        <?php  
         $verbindung_server=mysql_connect("example.com","db_xyz","passwort");  
         if(!$verbindung_server)  
          {  
           die("Verbindung zum Server nicht möglich: ".mysql_error());  
          }  
         mysql_set_charset("utf8");  
         $verbindung_db=mysql_select_db("db_xyz");  
         if(!$verbindung_db)  
          {  
           die("Verbindung zur Datenbank nicht möglich: ".mysql_error());  
          }  
        ?>  
        
        

        Kann ich das in dieser Datei und an dieser Stelle so lassen und erfüllt das dann den Zweck/die Aufagbe, auf die Du mich hingewiesen hast?

        Mir ist noch kein System begegnet, dass diese accept-charset-Angabe noch benötigt, wenn mindestens eins von beiden (HTTP-Header oder Meta-Element-Angabe) gesetzt ist.

        Wußte ich nicht, ich mache das _immer_ so, weil ich es hier bei SELFHTML so gelernt habe.

        Wenn man mit einer halbwegs aktuellen Version phpMyAdmin direkt Daten bearbeitet, gibt es keine Probleme. Der PMA hat seine Hausaufgaben gemacht und weiß, wie er richtig mit dem MySQL-Server zu reden hat. Problem ergeben sich nur dann, wenn auf anderen Wegen eine Kommunikation mit dem MySQL-Server stattfindet, bei der vergessen wurde, sich auf eine zu verwendende Kodierung zu einigen.

        Bei mir ist das lustig. Also ich habe, wie schon weiter oben geschrieben, die html-Datei mit dem Formular mittels <meta http-equiv="content-type" content="text/html; charset=utf-8" /> auf utf-8 gebracht, dann habe ich das <form action="/cgi-bin/auswertung.pl" method="post" accept-charset="utf-8"> im Formular selbst und als Kollation bei jedem Feld der Tabelle ebenfalls utf-8 eingestellt.

        Übertrage ich jetzt zB das Wort 'Hügel' in die DB und sehe mir dann den Datensatz via phpMyAdmin an, dann sehe ich dort ein 'Hügel' stehen. Lese ich den Datensatz aus, wird aber wieder 'Hügel' ausgegeben. Umgekehrt, wenn ich direkt über phpMyAdmin das Wort 'Hügel' eingebe, steht es genau so in der DB, wird aber wiederum nicht korrekt ausgegeben, wenn es per php ausgelesen wird.

        Ich nehme jetzt mal an, das liegt daran, daß ich bisher das mysql_set_charset("utf8"); nicht hatte, oder?

        Hmmm ... jedes mal, wenn ich denke, ich hab das mit dem utf-8 endlich kapiert, lerne ich _wieder_ was Neues kennen und verstehe es erst recht nicht mehr. Danke schon jetzt für weitere Erklärungen!

        Mit freundlichen Grüßen

        Professor Hase

        PS:Ich entschuldige mich schon _jetzt_ dafür, daß ich wahrscheinlich nicht mehr antworten werde auf dieses Posting. Das liegt aber nicht an meinem Desinteresse, sondern daran, daß dieser Beitrag längst im Archiv sein wird, wenn ich das nächste mal Zugang ins Internet habe.

        PPS:Sorry, es mußt _jedes mal_ DU dran glauben, wenn ich anstehe bei mysql, php und utf-8. Ich sollte mal ein Bier schicken. ;-)

        1. echo $begrüßung;

          Es reicht nicht, einfach nur irgendeine Kodierung zu verwenden. Wichtig ist, dass man dem Empfänger mitteilt, welche Kodierung verwendet wurde.
          Genau das meinte ich ja damit, als ich sagte, die Seite muß utf-8 codiert sein.

          Deine Aussage war mir nicht eindeutig genug. Es muss immer beides berücksichtigt werden, die Kodierung selbst und die Angabe zur Kodierung.

          <meta http-equiv="content-type" content="text/html; charset=utf-8" /> ist also nur _zweite_ Wahl?

          Wenn der Webserver vorkonfiguriert ist und eine charset-Angabe sendet, die nicht deiner tatsächlichen Kodierung entspricht, dann nützt dir die Meta-Element-Angabe nichts, weil beim Vorhandensein der charset-Angabe im HTTP-Header diese zu verwenden ist, sagt der Standard.

          Kannst Du das mit dem Content-Type-Header bitte näher erklären?

          Die HTTP-Header-Zeile Content-Type gibt dem Client an, was er da gerade für Daten empfängt. Das ist eine Pflichtangabe. Für Bild-Daten beispielsweise ist es image/irgendwas, für HTML ist es text/html. Und diese Angabe kann genauso wie bei der Meta-Element-Angabe um den charset-Zusatz ergänzt werden.

          Ist das was, was ich mit der .htaccess beeinflussen kann?

          Ja, das kann man in der Webserver-Konfiguration einstellen, dass er diese Angabe selbständig anhängt. Für den Apache zuständig sind die Direktiven AddDefaultCharset und AddCharset.

          <?php

          header("Content-type:text/html;charset=utf-8");
          ?>

            
          Auch das ist eine Möglichkeit. Damit macht man es von PHP aus, und überschreibt eine im Server voreingesstellte Content-Type(inklusive charset)-Konfiguration.  
            
          
          > Und um mich ganz zu verwirren, habe ich auch wo gelesen, daß man über die php.ini was machen kann: default\_charset = "utf-8"  
            
          Auch damit kann man die charset-Angabe hinzufügen.  
            
          
          > [...] hab über phpinfo() entdeckt, daß bei 'default\_charset' sowohl bei Local Value, als auch bei Master Value ein 'no value' steht.  
            
          Dann ändert PHP selbst an der Einstellung nichts.  
            
          
          > Ich dachte immer, das `<meta http-equiv="content-type" content="text/html; charset=utf-8" />`{:.language-html} reicht und ist auch das Einzige. OK, dann mache ich ab jetzt Beides. Nur wie?  
            
          Welches davon die beste Methode ist, kommt ganz drauf an, welche Möglichkeiten einem seitens der Administrators eingeräumt wurden. Ich bevorzuge AddDefaultCharset in der DocumentRoot-Konfiguration und eine konsequente Verwendung der angegebenen Kodierung. Damit kann man jedem Projekt an zentraler Stelle eine individuelle Kodierung vergeben.  
            
          Schreibt man Scripte, die auf unbekannten Konfigurationen laufen sollen, und man auch nicht annehmen kann, dass man den Webserver konfigurieren kann, so ist wohl der header()-Aufruf der beste Kompromiss.  
            
          
          > > Wenn du damit die MySQL-Tabelle (mit MySQL ab Version 4.1) meinst, dann ist das im Prinzip unwichtig. Das ist, genauso wie die Angabe zur Kollation für die Datenbank, nur ein Default-Wert, der für neu hinzugefügte, untergeordnete Elemente herangezogen wird, wenn für diese nicht explizit etwas eingestellt wurde.  
          >   
          > Ich meinte das, was unter phpMyAdmin für jeden Teil einer Tabelle unter "Kollation" eingestellt wird.  
            
          Ich interpretiere mal "jeden Teil einer Tabelle" als die Felder.  
          Feld x vom Typ y mit der Kollation z.  
          Wobei "Kollation" hier für das Gemisch aus Kodierung/Charset-Angabe und der Kollation steht.  
            
          
          > > Außerdem sollte bei der Kommunikation mit einem MySQL-Server eine Kodierung explizit ausgehandelt werden (mysql\_set\_charset() oder zur Not SET NAMES).  
          > Auch diesbezüglich habe ich jetzt lange gegoogelt. Hab ich das richtig verstanden, daß ich das in jene Datei dazuschreibe, in der die Verbindung zum Server hergestellt wird?  
            
          Das sollte nach jedem Verbindungsaufbau erfolgen, wenn einem die Daten lieb sind. Diese Einstellung gilt ja nur für die aktuelle Verbindung.  
            
          
          > Diese Datei ist bei mir ausgelagert an eine Stelle vor dem Wurzelursprung meines Webspaces [...]  
            
          Umso besser. Dann hast du nur eine einzige Stelle zu pflegen.  
            
          
          >  if(!$verbindung\_server)  
          >    die("Verbindung zum Server nicht möglich: ".mysql\_error());  
            
          Hat man dir schon mal gesagt, dass das Sterbenlassen mit Ausgabe der detailierten Fehlerursache bei so etwas banalem wie einer nicht zustandegekommenen Datenbankverbindung nicht gerade benutzer- dagegen aber sehr angreiferfreundlich ist? Besser ist es, das Script bis zum geplanten Ende auszuführen. Damit entsteht auch eine vollständige HTML-Seite, die ins Corporate Design passt und nicht nach der Hälfte abgeschnitten ist. Anstelle des Datenbankabfrageergebnisses kann man dem Anwender eine Tröstmeldung zeigen. Ändern kann der an dem Zusatand nichts, deswegen ist für ihn eine genaue Angabe des Fehlers nicht sinnvoll. Die Details sollten nur dem Administrator zur Verfügung gestellt werden, sei es in einem regelmäßig zu sichtendem Logfile oder auch per Mailversand.  
            
          
          > Übertrage ich jetzt zB das Wort 'Hügel' [UTF-8-kodiert] in die DB und sehe mir dann den Datensatz via phpMyAdmin an, dann sehe ich dort ein 'Hügel' stehen. Lese ich den Datensatz aus, wird aber wieder 'Hügel' ausgegeben. Umgekehrt, wenn ich direkt über phpMyAdmin das Wort 'Hügel' eingebe, steht es genau so in der DB, wird aber wiederum nicht korrekt ausgegeben, wenn es per php ausgelesen wird.  
          > Ich nehme jetzt mal an, das liegt daran, daß ich bisher das mysql\_set\_charset("utf8"); nicht hatte, oder?  
            
          Genau das ist der Grund. MySQL wird als Default-Verbindungs-Kodierung Latin1 eingestellt haben. Es erkennt die beiden Bytes der UTF-8-Sequent vom ü als zwei Latin1-Zeichen an. Kodiert diese so um, dass sie zur angegebenen Feld-Kodierung passen. Der PMA sieht die beiden Zeichen genauso einzeln, wie sie MySQL interpretiert hat. Bei der Ausgabe über eine Latin1-Verbindung bekommst du ebenfalls wieder zwei Zeichen zurück. Da du sie aber als UTF-8-Sequenz interpretierst, ist die Welt für dich in Ordnung. Du bekämst nur dann Probleme, wenn die Feldlänge auf 5 eingestellt wäre. Dann hat das l keinen Platz mehr, weil das ü zwei Zeichen belegt, und "Hüge" wäre das was zurückkommt.  
            
            
          echo "$verabschiedung $name";
          
        2. @@Professor Hase:

          Kannst Du das mit dem Content-Type-Header bitte näher erklären? […] Ist das was, was ich mit der .htaccess beeinflussen kann?

          FAQ: Einstellung der Zeichencodierungsangabe in .htaccess ...

          […] daß dieser Beitrag längst im Archiv sein wird, wenn ich das nächste mal Zugang ins Internet habe.

          ... dann womöglich schon auf Deutsch.

          Live long and prosper,
          Gunnar

          --
          “New Jersey Hall of Fame? […] But then I ran through the list of names: Albert Einstein, Bruce Springsteen... my mother's going to like that. […] it's the only time she's going to hear those two names mentioned in the same sentence, so I'm going to enjoy it.” (Bruce Springsteen when inducted into the New Jersey Hall of Fame, 2008-05-04)
    2. Tach,

      aber wahsage (ich vermisse ihn)

      der spricht hier weiterhin die Wahrheit, nennt sich aber inzwischen bürgerlicher, soweit ich das einschätzen würde.

      mfg
      Woodfighter