Kalle_B: Probleme mit Umlauten

Hallöle,

nach Portierung eines Projektes auf MySQL 5.0.32-Debian gibt es Probleme mit Umlauten.

In der Datenbank habe ich keine Stadt "K?ln", aber 84 mal "Köln", mit phpmyadmin geprüft.

Wenn ich nun ein mysql_query mache und dann dies:

while ( $row = mysql_fetch_array( $res ))
      {
echo "<pre>".$row['ort']." / ";
...

bekomme ich "K?ln". Egal, ob
<meta http-equiv='content-type'      content='text/html;charset=ISO-8859-1'>

oder
<meta http-equiv='content-type'      content='text/html;charset=UTF-8'>

Wo gehen die Umlaute verloren?

Lieben Gruß, Kalle

  1. In der Datenbank habe ich keine Stadt "K?ln", aber 84 mal "Köln", mit phpmyadmin geprüft.

    Und mit welchem Zeichensatz korrespondiert phpmyadmin mit der Datenbank?

    Wenn ich nun ein mysql_query mache und dann dies:

    Mit welchem Zeichensatz korrespondierst du mit der Datenbank (siehe MySQL-Dokumentation, Verbindungszeichensatz?

    <meta http-equiv='content-type'      content='text/html;charset=ISO-8859-1'>

    Diese HTML-Angabe wird von der gleichlautenden im HTTP-Kopf überschrieben. Prüfe daher auch, welchen Zeichensatz der Browser benutzt (Menü Seiteneigenschaften) und was per HTTP gesendet wird (zB mit LiveHTTPHeaders für Firefox).

    1. Und mit welchem Zeichensatz korrespondiert phpmyadmin mit der Datenbank?

      Wo kann man die "Korrespondenz" sehen? Der FF meldet Unicode(UTF-8), deshalb habe ich es ja auch damit ausprobiert.

      Der Ort in der DB hat Kollation latin1_german1_ci

      Habe mit phpmyadmin rausgefunden, dass ein Datensatz die Stadt K�ln und die Strasse Mathias-Br�ggen-Str. hat. Einmal ö, einmal ü, auf gleiche Weise angezeigt.

      Habe in phpmyadmin dann diesen gemacht:
      update adressen set ort='Köln' where ort='K�ln'

      In phpmyadmin steht bei diesem Satz nun 'Köln' drin, in meinem Programm weiterhin 'K?ln'.

      Irgendwie fehlt mir der Einstieg zum Verständnis.

      Kalle

      1. Und mit welchem Zeichensatz korrespondiert phpmyadmin mit der Datenbank?

        Wo kann man die "Korrespondenz" sehen?

        Ich bin der Meinung, dass der aktuelle Zeichensatz der Datenbank irgendwo gleich eingangs angezeigt wird (und sich auch ändern lässt). Benutze den Kram aber nicht, insofern musst du selbst ein wenig suchen.

        Der Ort in der DB hat Kollation latin1_german1_ci

        Das bestimmt erstmal lediglich die Sortierregeln (collation, Deutsch: Textvergleich), nicht unbedingt die Zeichenkodierung. Siehe MySQL-Dokumentation, Zeichensätze und Sortierfolgen.

        Habe mit phpmyadmin rausgefunden, dass ein Datensatz die Stadt K�ln und die Strasse Mathias-Br�ggen-Str. hat. Einmal ö, einmal ü, auf gleiche Weise angezeigt.

        Wieso denn das nun auf einmal, eingangs schriebst du noch "In der Datenbank habe ich keine Stadt "K?ln", aber 84 mal "Köln", mit phpmyadmin geprüft."?

        Eine Ausgabe in dieser Art bedeutet immer, dass ein utf-8-kodierter Datenstrom mit der Kodierung iso-8859-1 dekodiert wird (zB bei der Ausgabe durch PHP) oder wurde (zB beim Import durch MySQL).

        � ist die (per iso-8859-1 angezeigte) utf-8-Kodierung des Zeichens fffd, ein Platzhalter für unbekannte Zeichen. Wenn du also tatsächlich � in der Datenbank hast, dann ist beim Datenimport irgendwas schiefgegangen; du könntest zum Beispiel eine iso-8859-kodierte SQL-Datei importiert haben, während MySQL dachte, die Daten seien utf-8-kodiert. Die vermeintlich kaputten Bytes hat MySQL dann mit dem Platzhalter fffd ersetzt.

        Habe in phpmyadmin dann diesen gemacht:
        update adressen set ort='Köln' where ort='K�ln'

        In phpmyadmin steht bei diesem Satz nun 'Köln' drin, in meinem Programm weiterhin 'K?ln'.

        Gut, das phpmyadmin seine selbst gesetzten Daten richtig anzeigt, ist nicht so verwunderlich.

        1. echo $begrüßung;

          Und mit welchem Zeichensatz korrespondiert phpmyadmin mit der Datenbank?
          Wo kann man die "Korrespondenz" sehen?
          Ich bin der Meinung, dass der aktuelle Zeichensatz der Datenbank irgendwo gleich eingangs angezeigt wird (und sich auch ändern lässt).

          Die Korrespondenz des PMA mit der Datenbank ist seine Sache. Sie ist für die Kommunikation anderer Clients mit dem MySQL-Server nicht von Belang. Die Anzeige auf der Startseite kann man also ignorieren. Auf der Seite "MySQL-Server-Variablen anzeigen" stehen die Default-Werte, die MySQL verwendet, wenn keine anderen Angaben gemacht wurden. Sie beginnen mit "character set" und wenn eine Zeile "(Globaler Wert)" vorhanden ist, dann gilt diese. Die andere ist dann lediglich die aktuelle Einstellung, die sich der PMA gesetzt hat.

          Der Ort in der DB hat Kollation latin1_german1_ci
          Das bestimmt erstmal lediglich die Sortierregeln (collation, Deutsch: Textvergleich), nicht unbedingt die Zeichenkodierung.

          Es wird sowohl Kodierung als auch Kollation damit festgelegt. "latin1" ist dabei die Kodierung. Aber die Kodierung der Felder bestimmt nur, welche Zeichen es aufnehmen kann. Wie (in welcher Kodierung) die Feldinhalte von und zum Client gelangen, steht auf einem anderen Blatt: Connection Character Sets and Collations

          echo "$verabschiedung $name";

      2. Hello out there!

        Irgendwie fehlt mir der Einstieg zum Verständnis.

        SELFHTML: <http://de.selfhtml.org/inter/sprache.htm@title=Computer und geschriebene Sprache> ff.

        See ya up the road,
        Gunnar

        --
        „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)
  2. Hallo Kalle_B,

    Ist dein Script als UTF-8 gespeichert?

    Gruß,

    Dieter

  3. Hello,

    nach Portierung eines Projektes auf MySQL 5.0.32-Debian gibt es Probleme mit Umlauten.

    hat das eventuell 'was mit der Einstellung des Apachen (?) auf dem neuen Server zu tun?
    Wie lautet da das default Character Set?

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

  4. Hallöle,

    weil mein PC immer langsamer wurde (zu viele Instanzen von FF offen?), habe ich neu gebootet.

    Jetzt sieht das Problem so aus:
    Toyota Köln ist 'Köln' in Programm A, das ich mit ISO-8859-1 anzeige. Toyota in Programm B mit UTF-8 zeigt 'K�ln'.

    Das gleiche mit Nokia Düsseldorf.

    Nach Umstellung des Programms B auf ISO-8859-1 bleibt das Problem. Ich sehe im Quelltext
    <meta http-equiv='content-type'      content='text/html;charset=ISO-8859-1'>

    aber FF zeigt Unicode(UTF-8). Ich verstehe es einfach nicht.

    Ich boote noch mal und melde mich gleich wieder.

    Kalle

    1. Hello,

      aber FF zeigt Unicode(UTF-8). Ich verstehe es einfach nicht.

      Schaue dir die HTTP-Header an, was da gesendet wird, und schaue, ob der Server auch das passende Character-Set dazu benutzt. Du suchst mMn auf der verkehrten Seite.

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau

    2. so, da bin ich wieder.

      Ich werde gleich auch mal mit dem IE testen.

      Also: In Programm 101 wird Nokia Düsseldorf richtig mit ü angezeigt.
      FF Ansicht-Zeichencodierung-UTF-8. Ansicht-Seitenquelltext-ISO-8859-1

      Schon Mist, wenn meine Zeichencodierung ignoriert wird. Wozu ist dann der meta-tag gut?

      In Programm 131 kommt Nokia mit D?sseldorf. FF Ansicht-Zeichencodierung ebenfalls UTF-8, Ansicht-Seitenquelltext-ISO-8859-1

      Ich checke noch ab, ob es den Datensatz vielleicht zweimal gibt. Nein, es ist beide Male id=2865.

      Ich schnalle es nicht.

      Jetzt das gleiche Spielchen mit dem IE 6.

      In Programm 101 ebenfalls Düsseldorf mit ü, in Programm 131 mit ?
      Auch im IE Ansicht-Codierung beide Male als UTF-8, beide Male Quelltext ISO-8859-1

      Und jetzt wird die Sau in der Pfanne verrückt: Im Quelltext 131 vom IE steht "Düsseldorf" mit ü.

      Bevor jetzt noch rosarote Elefanten aufmarschieren, mache ich meinen Laden zu.

      Kalle *ver-drei-felt*

      1. also, in Programm 101 zeigen FF und IE Düsseldorf mit ü richtig an.

        Für Programm 131 gebe ich im FF und IE exakt dieselbe URL ein. Leider kann ich sie hier nich posten, weil der Auftraggeber Öffentlichkeit untersagt hat.

        Jetzt müsste doch derselbe Quellcode vom PHP- Programm kommen, oder?

        Im FF sehe ich dieses:

        <div class='row bggelb'>
          <input type='hidden' name='kontakt_id[49]' value='77295'>
          <input type='hidden' name='partner_id[49]' value='2865'>
          <input type='hidden' name='prio_1_alt[49]' value='1'>

        <input type='hidden' name='prio_2_alt[49]' value='0'>
          <input type='hidden' name='prio_3_alt[49]' value='0'>
          <input type='hidden' name='bemerkung_alt[49]' value=''>
          <input type='hidden' name='ist_termin[49]' value='0'>

        <p class='button sp01'>49</p>
          <p class='float sp02'>&nbsp;
          <a href="/tm3/tm_manager.php?zp=p422&kw=Kalle07&ll=1179345179&aus_id=2865&bes_id=2487">man.</a>

        </p>
          <p class='float sp03'><input type='checkbox' name='prio_1[49]' id=prio_1_49 value='1' checked ></p>
          <p class='float sp04'><input type='checkbox' name='prio_2[49]' id=prio_2_49 value='1'  ></p>
          <p class='float sp05'><input type='checkbox' name='prio_3[49]' id=prio_3_49 value='1'  disabled></p>
          <p class='float sp06'><input type='text' name='bemerkung[49]' value='' maxlength=5 size=5 ></p>
          <p class='float sp07'>
            <label for=prio_1_49>
          <b>Nokia Automotive</b>, D�ssel.. &nbsp; -2- <i class=em08>0 </i></label></p>

        <p class='float sp08'>&nbsp;Nokia</p>
          <p class='float sp09'>&nbsp;<a href='javascript:zeigGruppe()'></a></p>
          <p class='float sp10'>&nbsp;<i class=kl></i></p>
          <div class=clear></div>
        </div>

        und im IE jenes:

        <div class='row bggelb'>
          <input type='hidden' name='kontakt_id[49]' value='77295'>
          <input type='hidden' name='partner_id[49]' value='2865'>
          <input type='hidden' name='prio_1_alt[49]' value='1'>
          <input type='hidden' name='prio_2_alt[49]' value='0'>
          <input type='hidden' name='prio_3_alt[49]' value='0'>
          <input type='hidden' name='bemerkung_alt[49]' value=''>
          <input type='hidden' name='ist_termin[49]' value='0'>

        <p class='button sp01'>49</p>
          <p class='float sp02'>&nbsp;
          <a href="/tm3/tm_manager.php?zp=p422&kw=Kalle07&ll=1179345179&aus_id=2865&bes_id=2487">man.</a>
          </p>
          <p class='float sp03'><input type='checkbox' name='prio_1[49]' id=prio_1_49 value='1' checked ></p>
          <p class='float sp04'><input type='checkbox' name='prio_2[49]' id=prio_2_49 value='1'  ></p>
          <p class='float sp05'><input type='checkbox' name='prio_3[49]' id=prio_3_49 value='1'  disabled></p>
          <p class='float sp06'><input type='text' name='bemerkung[49]' value='' maxlength=5 size=5 ></p>
          <p class='float sp07'>
            <label for=prio_1_49>
          <b>Nokia Automotive</b>, Düssel.. &nbsp; -2- <i class=em08>0 </i></label></p>
          <p class='float sp08'>&nbsp;Nokia</p>
          <p class='float sp09'>&nbsp;<a href='javascript:zeigGruppe()'></a></p>
          <p class='float sp10'>&nbsp;<i class=kl></i></p>
          <div class=clear></div>
        </div>

        Man achte auf D�ssel.. (FF) und Düssel.. (IE)

        Was kann die Ursache sein, dass mein PHP- Programm verschiedene HTML- Sourcen liefert? Oder lügt der FF oder der IE noch bei der Quellcode- Anzeige?

        Kalle

        1. Hallo

          was sagt die livehttpheaders-Extension für Firefox, die Dir Bla bereits ans Herz gelegt hat, über die von Deinem Server gesendeten Header?

          Freundliche Grüße

          Vinzenz

        2. Hello,

          Was kann die Ursache sein, dass mein PHP- Programm verschiedene HTML- Sourcen liefert? Oder lügt der FF oder der IE noch bei der Quellcode- Anzeige?

          Wenn Du den IE 6 ff benutzt, dann "lügt" der auch bei der Quellcodeanzeige.
          Wenn er utf-8 Codierung erkennt, zeigt er die auch als solche aufgelöst an, also _nicht_ die wirklich übertragenen Byte-Codes, wie man es aus ASCII oder sonstigen ein-Byte-Codes kennt.

          Harzliche Grüße vom Berg
          http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau

      2. Schon Mist, wenn meine Zeichencodierung ignoriert wird. Wozu ist dann der meta-tag gut?

        Für diejenigen, die keinen Zugriff auf das entsprechende HTTP-Element haben (daher auch "http-equiv"). Zur Vermeidung von Missverständnissen sollte dieses Datum aber nur an einem Ort angegeben werden bzw. bei Missverständnissen muss immer geprüft werden, ob das Datum nicht an zwei Orten, einmal per HTTP, einmal per HTML, angegeben wurde.

        In Programm 131 kommt Nokia mit D?sseldorf. FF Ansicht-Zeichencodierung ebenfalls UTF-8, Ansicht-Seitenquelltext-ISO-8859-1

        Was sind denn bitte "Programm 101" und "Programm 131"?

        Es wäre sinnvoll, wenn du in dem Durcheinander ganz unten anfängst und ein Testskript schreibst, das diesen einen Datensatz ausliest und ausgibt; ein halbes Dutzend Zeilen, beginne mit 'header("Content-Type: text/plain; charset=iso-8859-1");', dann connect, query, fetch, echo, ohne irgendwelchen weiteren Schnickschnack, kein HTML.
        Probiere bei header() andere Zeichensätze, versuche SET NAMES. Lass' dir mit SHOW Details ausgeben.

        Du musst jetzt erstmal rausfinden, was überhaupt in deiner Datenbank drin ist.