Avatar billede mantichora Nybegynder
24. marts 2007 - 20:38 Der er 10 kommentarer og
2 løsninger

AJAX, MySQL og danske tegn

Så driller AJAX igen.

Jeg har en chat/messageboard tingest, hvor jeg tilføjer og henter en liste over beskeder via AJAX. Jeg tilføjer dem således:

function send(frm, id) {
  var msg = encodeURI(frm.cfmsg.value);
  var name = encodeURI(frm.cfname.value);

  http = null;
  http = GetXmlHttpObject();
  http.open("GET", "chatparser.php?addmsg="+msg+"&name="+name+"&getfromid="+id, true);
  http.onreadystatechange = callback;
  http.send(null);
}

Og udskriver det sådan:

function callback() {
  if (http.readyState == 4) {
    var json = eval("("+http.responseText+")");

    if (json.Messages.length > 0) {
      var obj = document.getElementById('chatcontent');
      obj.innerHTML = json.Messages + obj.innerHTML;
    }
  }
}

Og jeg gemmer så, via PHP, dataene i en MySQL database. Ganske almindelig INSERT og SELECT.
Jeg bruger charset ISO-8859-15 på alle sider.

Mit problem:
Når jeg får dataene ud, er ÆØÅæøå-tegn forkerte, og består af to tegn, som ligner noget jeg aldrig har set før. Jeg kan sikkert ikke skrive dem her på eksperten, men jeg forsøger lige - her er et å: "Ã¥". Men KUN på IE.

Jeg forsøgte at tilføje et htmlspecialchars()-kald til teksten før den bliver sat ind i databasen, og til min store overraskelse fungerede det så fint på IE, men ikke længere på Firefox(!)

Hvordan helvede får jeg det til at virke ordentligt begge steder?
Anyone? Please?
Avatar billede kongfjong Nybegynder
24. marts 2007 - 21:06 #1
Har du også sørget for, at outputtet fra chatparser.php er ISO-8859-15?

Jeg må indrømme at jeg er lidt i tvivl om content-type delen i denne kode, når nu du genererer json-output, men vil tro det skal være således:

header('Content-Type: text/plan; charset=ISO-8859-1');

Det stykke kode skal du smide ind i toppen af din chatparser.php fil:)
Avatar billede mantichora Nybegynder
24. marts 2007 - 21:15 #2
Ja, nu virker det på Firefox, men ikke på IE :S
Hvis jeg skriver "Alfons Åberg", står der "Alfons ?rg".

Men en vigtig ting jeg lige lagde mærke til, er at når jeg skriver en ting på Firefox, ser den også korrekt ud på IE, men når jeg skriver en ting på IE, ser den forkert ud både på IE og Firefox.

Altså må jeg konkludere at fejlen er hvor jeg sætter teksten IND i databasen, ikke hvor jeg hiver den ud. Det forstår jeg endnu mindre af, for jeg sætter det ind ganske normalt via:

$name = $_GET['name'];
$msg = $_GET['addmsg'];
$sql = "insert into messages (type, username, text) values (0, '$name', '$msg')";
mysql_query($sql);
Avatar billede kongfjong Nybegynder
24. marts 2007 - 21:22 #3
Hvordan ser det ud i db'en?
Avatar billede kongfjong Nybegynder
24. marts 2007 - 21:23 #4
For hvis det ser rigtig ud i db'en, må det så være problemet når du hiver det ud:)
Avatar billede mantichora Nybegynder
24. marts 2007 - 21:25 #5
Nej, NU fatter jeg da SLET ingenting :S

Det ser fint ud i phpMyAdmin. Men nu forsøgte jeg at ændre charset'et på chatparser.php til UTF-8 og fjerne htmlspecialchars før det bliver sat ind i databasen. Og nu virker det. - Men dog KUN så længe jeg beholder encodeURI-funktionen i javascript før det bliver sat ind. Hvis jeg fjerner det kald, går den amok igen.

Du må gerne svare, kongfjong. Dog er jeg endnu mere forvirret end før, så hvis nogen kan forklare HVORFOR den gør som den gør, vil jeg være meget glad.
Avatar billede mantichora Nybegynder
24. marts 2007 - 21:26 #6
Bemærk også at ALLE andre sider bruger ISO-8859-15, men hvis jeg sætter chatparser.php til det charset, virker det heller ikke.
Avatar billede kongfjong Nybegynder
25. marts 2007 - 10:03 #7
Mærkværdigt. Jeg har dog ikke benyttet mig af encodeURI funktionen i forbindelse med Ajax og heller ikke htmlspecialchars, men derimod blot sørget for, at benytte is-8859-1 i den php fil ajax-scriptet kalder:)
Avatar billede roenving Novice
25. marts 2007 - 22:53 #8
Bemærk, at _hele_ kæden skal benytte samme karakter-encoding, dvs., at både din database, din serverside-kodning og den sendte html skal bruge præcis det samme karaktersæt !-)
Avatar billede olebole Juniormester
26. marts 2007 - 13:22 #9
<ole>

Hvis du bruger ISO-8859-15, skal du bruge escape - bruger du utf-8, skal du bruge encodeURIComponent ... du skal under ingen omstændigheder bruge encodeURI, når du kun escape'er variabel-værdier.

Desuden skal du checke din servers default-charset - og det samme for din MySQL-DB. Det er ikke nok at sætte metas - og heller ikke altid headers. Udfra disse informationer, beslutter du så, hvad du skal gøre  =)

/mvh
</bole>
Avatar billede mantichora Nybegynder
28. marts 2007 - 14:51 #10
Beklager jeg har været lidt væk.

Du ramte vist hovedet på sømmet dér, Ole. Det var tilsyneladende serveren der ikke ville acceptere mit valgte charset, da jeg satte det med meta. Men da jeg smækkede en header ind på ALLE php-sider med charset: UTF-8 (kan stadig ikke få det samme til at virke med ISO-8859-15), virkede det.

Jeg er stadig ikke helt tilfreds med at ISO-8859-15 ikke vil virke, men det må gå an. Smid svar Olebole og Kongfjong :)
Avatar billede olebole Juniormester
29. marts 2007 - 15:06 #11
Jeg har selv været ude for ikke at kunne overskrive default-charset'et med en HTTP-header i PHP. Hvis serveren således sender utf-8 som default, kan du måske ikke overskrive det med en header, der forsøger at ændre det til ISO-8859-15(?)
Avatar billede kongfjong Nybegynder
29. marts 2007 - 18:31 #12
Ahh interessent problemstilling omkring default charset...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester