foomaker: Javascript -> PHP -> MySQL: Umlautproblem

Tach zusammen,

HIIIIIIIIIIIIIIIIILFEEEEEEEEE!!  ;-)

Ich versuche mal darzustellen, was eingabe- und scriptmäßig passiert bis es zu einem fehlerhaften MySql-Eintrag kommt. Im Spiel sind javascript, php und MySql, wobei ich mittlerweile alles, was ich zur Fehlerbehebung finden konnte und meines Erachtens relevant ist, ausprobiert habe, um den Fehler zu beseitigen. Aber der Reihe nach:

1. In einem utf8-HTML-input-Element (id="label01") ist eingetragen "Tröte" (klar, ohne Anf.-Zeichen)

2. JS-Funktion: ~~~javascript

label = document.getElementById('label01').value;
url = "speichern.php?label=" + label;
window.open(url,'test');

  
3\. speichern.php:~~~php
  
$label = $_GET['label'];  
$labelEscaped = mysql_real_escape_string($label);  
mysql_connect(SERVER, USER, PASS);  
mysql_select_db(DB);  
mysql_query("SET NAMES 'utf8'");  
$sql = "update tabelle set label='$labelEscaped' where id='1'; // der DS existiert  

Ergebnis im Datensatz: label = 'Tr', 'öte' fehlt.

Testausgaben:
a) echo $label ergibt 'Tröte'
b) echo $sql ergibt "update tabelle set label='Tröte' where id='1'"
c) Die URL des Popup-Fensters zeigt: "http://...speichern.php?label=Tröte"

Hat mal einer einen Tipp oder kann mir gleich sagen, was ich übersehen bzw. falsch gemacht habe?

Danke. :-))

Gruß vom foomaker

--
Ändere, was Du ändern kannst.
Akzeptiere, was Du nicht ändern kannst.
Lerne, das eine vom anderen zu unterscheiden.``
  1. Hallo,

    HIIIIIIIIIIIIIIIIILFEEEEEEEEE!!  ;-)

    schrei hier bitte nicht so rum, vielleicht möchte mancher noch ein wenig länger schlafen!

    1. In einem utf8-HTML-input-Element (id="label01") ist eingetragen "Tröte" (klar, ohne Anf.-Zeichen)

    Das HTML-Dokument
     a) wird vom Server im HTTP-Header als UTF-8 gekennzeichnet?
     b) ist auch tatsächlich in UTF-8 codiert?

    1. JS-Funktion:

    label = document.getElementById('label01').value;

    url = "speichern.php?label=" + label;
    window.open(url,'test');

      
    Javascript arbeitet intern immer mit Unicode, hier dürfte noch kein Problem entstehen. Aber wenn die Ausgabe hier richtig aussieht, deutet das immerhin darauf hin, dass die tatsächliche Codierung des Dokuments zur angeblichen passt.  
      
    
    > 3. speichern.php:  
    > ~~~php
    
    $label = $_GET['label'];  
    
    > $labelEscaped = mysql_real_escape_string($label);  
    > mysql_connect(SERVER, USER, PASS);  
    > mysql_select_db(DB);  
    > mysql_query("SET NAMES 'utf8'");  
    > $sql = "update tabelle set label='$labelEscaped' where id='1'; // der DS existiert
    
    

    Wird diesem Script der Text auch in UTF-8 übergeben?

    Ergebnis im Datensatz: label = 'Tr', 'öte' fehlt.

    Ich vermute also: Nein. Ich vermute, das 'ö' wird als ISO-8859-x-codiertes Zeichen übergeben (also als 0xFC). Wenn in einem UTF-8-String ein 0xFC auftaucht, bedeutet das aber, dass noch drei folgende Bytes zum gleichen Zeichen gehören. Da kommen aber nur noch zwei, nämlich 0x74='t' und 0x65='e'.

    Testausgaben:
    a) echo $label ergibt 'Tröte'
    b) echo $sql ergibt "update tabelle set label='Tröte' where id='1'"
    c) Die URL des Popup-Fensters zeigt: "http://...speichern.php?label=Tröte"

    Wichtiger als die Ausgabe ist in dem Fall die Info, wie das 'ö' an den jeweiligen Stellen codiert ist.

    Hat mal einer einen Tipp oder kann mir gleich sagen, was ich übersehen bzw. falsch gemacht habe?

    Need more input. ;-)

    Ciao,
     Martin

    --
    F: Was ist schneller: Das Licht oder der Schall?
    A: Offensichtlich der Schall. Wenn man den Fernseher einschaltet, kommt immer erst der Ton, und dann erst das Bild.
    1. Hallo Martin,

      erstmal Danke für Deine Antwort.

      HIIIIIIIIIIIIIIIIILFEEEEEEEEE!!  ;-)

      schrei hier bitte nicht so rum, vielleicht möchte mancher noch ein wenig länger schlafen!

      Genau deshalb war ich so laut. ;-)

      Ich habe Deine Erklärungen aufmerksam studiert und im Wesentlichen verstanden.
      Immerhin brachten sie mich auf die Idee, es noch einmal mit einem tieferen Blick in die JS-Funktionalitäten zu versuchen - und siehe da - es gibt die Funktion encodeURI().

      Mit dem PHP-Pendant im Empfängerscript 'urldecode()' klappt es nun wie gewünscht - utf8 hin, utf8 her.

      Für Deine Unterstützung nochmal herzlichen Dank und einen schönen Tag.

      Gruß vom foomaker

      --
      Ändere, was Du ändern kannst.
      Akzeptiere, was Du nicht ändern kannst.
      Lerne, das eine vom anderen zu unterscheiden.