Niels Gamborgs online notesbog

AJAX, MySQL og dansk tegnsæt. Når æ, ø og å forsvinder.

februar 15th, 2008. Kategori: Webudvikling

AJAX og MySQL

AJAX giver ofte problemer med at æ, ø og å forsvinder. Især optræder problemet, når AJAX skal hente informationer fra databaser.

Det er med PHP og MySQL, jeg har oplevet problemerne. Både når jeg har hentet data fra min egen MySQL database, men også, når jeg har hentet oplysninger fra PHPBB forums’s MySQL database.

Der er flere tegnsæt, som kan håndtere æ, ø og å, men det er min fornemmelse, at problemet ofte opstår, når der kommer konflikt mellem forskellige tegnsæts deklarationer. Og det gør der f.eks., hvis du bruger et tegnsæt i din MySQL database, og et andet på dine HTML sider.

Tegnsætsproblemer kan drille meget, og løsningerne ligger sjældnet lige for, så ofte skal man eksperimentere kraftigt for at løse dem og få sine æ’er ø’er og å’er tilbage. 

En let løsning

Den lette løsning (som heldigvis også virker i mange tilfælde) er at sende en tegnsætsdeklaration med tilbage i headeren af den fil, der leverer data til AJAX requesten.

header(“Content-Type: text/xhtml+xml; charset=iso-8859-1”);

En besværlig løsning

Hvis alt andet ikke virker, kan en besværlig løsning være at konvertere dine æ, ø og å til “html – special characters”:

æ = &aelig
ø = &oslash
å = &aring
OBS. Husk at sætte et semicolon efter hvert tegn.

Denne løsningen er meget bøvlet, og er sjældent et realistisk alternativ, men kan være redningen i enkelte tilfælde.

  1. 4 Responses to “AJAX, MySQL og dansk tegnsæt. Når æ, ø og å forsvinder.”

  2. By Jonas on dec 17, 2008

    Det bedste er at gøre det til en vane altid at lave alle sites i UTF-8. Æ, ø og å virker fint, og det samme gør andre alfabeters tegn, så man behøver ikke lave noget om, hvis ens site pludselig skal oversættes til f.eks. russisk.

    Man skal huske at angive tegnsæt alle relevante steder:

    – I MySQL: Skriv “DEFAULT CHARSET=utf8” efter alle CREATEs, f.eks. “CREATE TABLE test ( id INT ) DEFAULT CHARSET=utf8”. Bemærk, at UTF-8 hedder utf8 (uden bindestreg) i MySQL.

    – I PHP’s forbindelse til MySQL (http://dk2.php.net/manual/en/mysqli.set-charset.php / http://dk2.php.net/manual/en/function.mysql-set-charset.php).

    – I Content-Type-HTTP-headeren. PHP sætter den automatisk, hvis man sætter PHP-indstillingen default_charset til UTF-8 (se http://dk.php.net/manual/en/ini.core.php#ini.default-charset).

    – Man bør også bruge mbstring-funktionerne: http://dk.php.net/mbstring.

    JavaScript bruger UTF-8 som standard, så ingen problemer dér.

  3. By Niels on dec 17, 2008

    Godt råd, Jonas. 🙂

    Hvis der ikke er specielle årsager til at bruge ISO-8859-1 fra starten af kan man undgå mange encoding problemer ved udelukkende at bruge utf-8. Både i forhold til AJAX, MySQL og PHP, men også mere generelt.

  4. By Flemmin on nov 19, 2010

    http://www.php.net/manual/en/function.mb-convert-encoding.php

    mb_convert_encoding($txt, ‘UTF-8’)

    gjorde tricket for mig (har æ,ø,å i mysql databasen og data som UTF-8 danish) , men da jeg har et loop med html kode (<a>)
    i databasen, så virkede
    echo htmlentities($txt) ikke;

  5. By Niels on nov 19, 2010

    Tak for tippet Flemming. 🙂

Skriv en kommentar