Zeichensatzproblem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zeichensatzproblem

    Hallo,

    bitte nicht gleich schlagen, ich weiss das dieses Thema schon mehrfach behandelt wurde, aber trotz großer Recherche, sei es hier oder im www, finde ich keine funktionierende Lösung für mein Problem.

    Das Problem:
    Über eine Shoutbox, sollen Einträge in die DB (MySQL) geschrieben und anschließend die letzten 5 angezeigt werden. Dafür verwende ich Ajax, und im Prinzip läuft auch alles.
    Lediglich manchmal kommt zu Problemen mit dem Zeichensatz. Dann werden statt der Umlaute Zeichen wie "¼Ä" angezeigt. Diese Zeichen landen genauso auch in der Datenbank.
    Was mich nun aber wunderte ist das ein und der selbe User mal saubere Einträge erstellte, mal nicht. Also habe ich selber erstmal den Fehler bei mir in der Programmierung vermutet, und habe folgedes festgestellt:
    Wenn ich eine Seite direkt aufrufe, also über die Adresszeile, dann bekomme ich keine Umlaute angezeigt. Surfe ich auf der Seite, dh. klicke ich auf einen Link, und sei es der für die Startseite, dann bekomme ich die Umlaute sauber angezeigt.
    Seltsam.

    Habe gestern ein paar Stunden nach Lösungen gesucht und probiert das Problem zu lösen, aber ohne erfolg.

    Vielleicht könnt ihr mir weiterhelfen.

    Hier der Quellcode:
    Ajax-Teil:

    Quellcode

    1. function check_box(){
    2. var sms = document.getElementById("sms_text").value;
    3. if ((sms.length > 160) || ((sms.length < 2) && (sms.length != 0))){
    4. alert("Textlänge ungültig");
    5. }
    6. else{
    7. var url="set_sms.php?sms="+sms;
    8. document.getElementById("sms_text").value = '';
    9. document.getElementById('showsms').innerHTML="SMS-Box wird aktualisiert.<br>Bitte warten!";
    10. //alert(url);
    11. xmlHttp=GetXmlHttpObject(stateChanged);
    12. xmlHttp.open("GET", url , true);
    13. xmlHttp.send(null);
    14. }
    15. }
    16. function stateChanged()
    17. {
    18. if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
    19. {
    20. document.getElementById("showsms").innerHTML=xmlHttp.responseText ;
    21. }
    22. }
    23. function GetXmlHttpObject(handler)
    24. {
    25. var objXmlHttp=null
    26. /*
    27. if (navigator.userAgent.indexOf("Opera")>=0)
    28. {
    29. alert("This example doesn't work in Opera")
    30. return
    31. }
    32. */
    33. if (navigator.userAgent.indexOf("MSIE")>=0)
    34. {
    35. var strName="Msxml2.XMLHTTP"
    36. if (navigator.appVersion.indexOf("MSIE 5.5")>=0)
    37. {
    38. strName="Microsoft.XMLHTTP"
    39. }
    40. try
    41. {
    42. objXmlHttp=new ActiveXObject(strName)
    43. objXmlHttp.onreadystatechange=handler
    44. return objXmlHttp
    45. }
    46. catch(e)
    47. {
    48. alert("Error. Scripting for ActiveX might be disabled")
    49. return
    50. }
    51. }
    52. if ((navigator.userAgent.indexOf("Mozilla")>=0) || (navigator.userAgent.indexOf("Opera")>=0))
    53. {
    54. objXmlHttp=new XMLHttpRequest()
    55. if (objXmlHttp.overrideMimeType) {
    56. objXmlHttp.overrideMimeType('text/html; charset=ISO-8859-1');
    57. }
    58. objXmlHttp.onload=handler
    59. objXmlHttp.onerror=handler
    60. return objXmlHttp
    61. }
    62. }
    63. </script>
    Alles anzeigen


    Die Datei set_sms.php

    Quellcode

    1. <?
    2. $header = "HTTP/1.0 200 OK\r\n";
    3. $header .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
    4. $header .= "Cache-Control: no-store, no-cache, must-revalidate\r\n";
    5. $header .= "Cache-Control: post-check=0, pre-check=0\r\n";
    6. $header .= "Pragma: no-cache\r\n";
    7. $header .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
    8. header($header);
    9. require 'connect.php';
    10. if ($HTTP_GET_VARS['sms'])
    11. $sms = $HTTP_GET_VARS['sms'];
    12. ...
    Alles anzeigen

    Den Rest erspar ich mir, denn wenn ich mir an dieser Stelle den Wert von $sms anzeigen lassen bekomme ich schon keine Umlaute angezeigt. Also muss es vorher passieren...

    Vielen Dank schon mal im Voraus für euren hilfreichen Vorschläge.
  • hast du es mal andersrum versucht???

    Per AJAX übertragene Daten SIND utf8 kodiert...also müssen sie decodiert gespeichert werden in der DB. und beim abrufen aus der db mit utf8_encode wieder codiert werden...

    versuchs einfach mal...


    mfg da BendIt
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • Ich würde beim Speichern nichts umkonvertieren.
    Je nachdem obs dann auf einer AJAX oder auf einer normalen Website wiedergegeben wird, hast du wieder Probleme.

    Wenn du die Daten unverändert in die Datenbank schreibst und beim Auslesen keine der drei folgenden Möglichkeiten funktioniert, dann läuft da irgendwas ziemlich falsch ;)

    Quellcode

    1. echo $var;
    2. echo utf8_encode($var);
    3. echo utf8_decode($var);


    Als letzte Möglichkeit bleibt dir immernoch deinen Text mit htmlentities zu konvertieren.
  • Danke für deine Hilfe,
    habe folgende Varianten probiert:

    Quellcode

    1. echo $var;
    2. echo utf8_encode($var);
    3. echo utf8_decode($var);


    utf8_encode führte zum Erfolg. Also alles darau umgestellt. Doch nun habe ich das gleich Problem nur anders herum. Nun klappt alles sofern die Seite direkt aufrufe, aber nicht wenn ich einem Link folge (ich hoffe ihr versteht mich).
    Das ist ja was mich verwirrt. Es scheint als gäbe es zwei verschiedene Zeichensätze, abhängig wie ich die Seite aufrufe.
    Aber die Zeichensätzte werden immer per Header gesetzt:

    Quellcode

    1. <?
    2. $header = "HTTP/1.0 200 OK\r\n";
    3. $header .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
    4. $header .= "Cache-Control: no-store, no-cache, must-revalidate\r\n";
    5. $header .= "Cache-Control: post-check=0, pre-check=0\r\n";
    6. $header .= "Pragma: no-cache\r\n";
    7. $header .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
    8. header($header);
    9. ?>


    Noch eine Idee?
  • Ganz im ernst.. ich hab mir damit nie Stress gemacht.
    Einfach die Serverconfig auf UTF-8 umstellen und nie Probleme haben ;)

    Aber der sicherste Workaround ist eben die Konvertierung in Entities. Oder musst du auch XML Code senden? Denn für reinen Text hast du mit htmlentities nie Probleme.

    Quellcode

    1. echo htmlentities($var);
    2. echo htmlentities(utf8_encode($var));
    3. echo htmlentities(utf8_decode($var));
  • Sag niemals nie, D0nUt ;)
    Das mit den entities hatte ich bereits probiert. Und trotzdem habe ich das selbe problem. Das Problem ist das die Daten mal so und mal so ankommen. Denn mit

    Quellcode

    1. echo htmlentities($var);
    2. echo htmlentities(utf8_encode($var));
    3. echo htmlentities(utf8_decode($var));

    bekomme ich mal beim ersten, mal beim 3. alles sauber in die Datenbank geschrieben (und auch wieder raus), ganz abhängig davon wie ich die Seite aufrufe (s.o.)
    Das was mich wundert ist nicht die Konvertierung, sondern diese unterschiedliche verhalten. Mal so, und dann wieder mal so. Das verwirrt mich und ich habe dafür auch keine erklärung.
    Fakt ist das die Seiten per Header jeweils auf ISO-8859-1 gesetzt werden. Aber teilweise per Ajax UTF-8 ankommt, aber halt nicht immer.

    Übersehe ich gerade etwas???
  • Das Problem ist doch, dass du das Formular sowohl über AJAX als auch normal anbietest. (It's not a bug - it's a feature ;-)) - nun würde ich die Daten auf jeden Fall als Entities speichern.

    Und beim Speichern über AJAX gibst du ein hidden Feld mit, dass darüber aufklärt, dass es sich um eine AJAX Seite handelt.

    Ist dieses Flag gesetzt wendest du die die utf8 Funktion an.
  • "Stressless" schrieb:

    Nein, nein. Das Formular wird ausschließlich per Ajax gesteuert.


    und da erhältst du unterschiedliche ergebnisse???

    welchen browser benutzt du? was sagt den die fehlerkonsole im firefox? (falls du den benutzt) hast du es denn schonmal ohne dem iso charset im header versucht?

    eigentlich sind die meisten server so eingerichtet das sie die daten in utf8 übertragen (vor allem bei ajax) ergo kann es zu problemen kommen wenn man ein anderes charset nutzt... außer bei einem direkt aufruf per url.

    hatte das selbe problem mit .phps files.

    beim direkten aufruf über die url haben die umlaute und sonderzeichen gestimmt, nur beim laden per ajax in ein div gings schief.

    deshalb wundert es mich ein wenig das es mit utf8_encode()/utf8_decode() nicht funzt bzw., wie du sagst, nur sporadisch....


    mfg da BendIt
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • Also, Browser ist der Firefox. Fehlerkonsole gibt keine fehler aus. Habe es auch schon ohne den Header probiert, ohne erfolg.
    Es sieht aus so aus als würde nur die übertragung nicht klappen. Denn die Daten die als Umlaut in der DAtenbank stehen werden auch als Umlaute ausgegeben. Das Anzeigen scheint also nicht das Problem zu sein, sondern die Übertragung.

    Ich kann mir nämlich auch nur die bisherigen Einträge anzeigen lassen, ohne etwas zu posten und da bekomme ich immer saubere Ergebnisse, sofern diese sauber in der DB stehen.
  • Dann schau dir die http übertragung mal an...

    geht in FF ziemlich gut z.b. mit Live Http Headers
    -> http://livehttpheaders.mozdev.org/installation.html#

    einfach installieren und testen.

    sobald du auf ein link klickst stehehn alle header daten da drin und du kannst dir anschauen obs da schon nicht mehr stimmt...

    zumindest kannst du so dem fehler auf die spur kommen....


    mfg da BendIt
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • Danke für den Tip.

    Kannte diesen Helferlein noch nicht.
    Also es wird folgendes ausgespuckt:

    GET /set_sms.php?sms=test%20%C3%BC%C3%B6%C3%A4 HTTP/1.1
    Host: *******************
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Content-Type: text/html; charset=ISO-8859-1

    HTTP/1.x 200 OK
    Date: Wed, 13 Jun 2007 07:54:16 GMT
    Server: Apache (SuSE/Linux)
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/html


    Dabei wurde falsch in die Datenbank geschrieben:

    Anschließend habe ich es anders probiert und da wurde folgendes ausgespuckt:

    GET /set_sms.php?sms=test%20%FC%F6%E4 HTTP/1.1
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Content-Type: text/html; charset=ISO-8859-1

    HTTP/1.x 200 OK
    Date: Wed, 13 Jun 2007 08:02:23 GMT
    Server: Apache (SuSE/Linux)
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/html


    Es werden also bereits bei der Übergabe andere Werte kodiert.

    GET /set_sms.php?sms=test%20%C3%BC%C3%B6%C3%A4 HTTP/1.1
    GET /set_sms.php?sms=test%20%FC%F6%E4 HTTP/1.1




    Ein Moderator hat den Beitrag übersichtlicher formatiert.
  • "Stressless" schrieb:


    Es werden also bereits bei der Übergabe andere Werte kodiert.
    GET /set_sms.php?sms=test%20%C3%BC%C3%B6%C3%A4 HTTP/1.1
    GET /set_sms.php?sms=test%20%FC%F6%E4 HTTP/1.1


    sind das beide die gleichen strings/werte?

    sieht für mich aus wie mit rawurlencode() codierte zeichenketten....

    versuch mal nach der übertragung das ganze mit rawurldecode() zurückzuwandeln.

    sollte ja eigentlich automatisch passieren...?

    [edit]

    wie übergibst du eigentlich die übertragenen zeichenketten an die db? hoffentlich nicht direkt mit $_POST/$_GET['sms'] in die query oder?

    [/edit]
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!