Aangezien ik graag het voetbalnieuws volg, maar niet elke keer alle voetbalsites wil bezoeken heb ik in PHP d.m.v. SimpleXML een scriptje gemaakt die de RSS feeds van een aantal sites inleest en dat nieuws verzameld.
Om het "gebruikelijke" charset probleem te ontlopen heb ik mezelf aangeleerd om altijd alles in UTF8 te doen, hiervoor doorloop ik de volgende stappen (voor de volledigheid het geheel, maar het gaat al bij stap 1 mis):
De data uit de rss gaat uiteindelijk door de volgende check:
In de database staan alle velden op utf8_unicode_ci.
De uiteindelijke pagina voorzie ik van UTF8 door zowel de header mee te sturen:
...als in de meta-tags:
De pagina geeft dan ook netjes de juiste "Tekenset", te weten utf8.
Nu gaat het echter al mis bij het plaatsen van de data in de database, de gebruikelijke "vreemde" tekens verschijnen al, dingen als: â€. Daarom ben ik gaan kijken wat bovenstaande check in php oplevert, maar die geeft keurig elke keer UTF-8 terug, dus:
geeft:
Een voorbeeld van de bron waar het mis gaat is deze. De browser geeft als "Tekenset" UTF-8 maar in de xml staat:
Kortom, het lijkt alsof die data niet UTF8 is, maar waarom vertelt mb_detect_encoding mij dan van wel?
Inmiddels ben ik zo week in de paasei geworden van dit probleem
, dat ik even een zetje in de goede richting nodig heb. Wie heeft de gouden tip?
Om het "gebruikelijke" charset probleem te ontlopen heb ik mezelf aangeleerd om altijd alles in UTF8 te doen, hiervoor doorloop ik de volgende stappen (voor de volledigheid het geheel, maar het gaat al bij stap 1 mis):
De data uit de rss gaat uiteindelijk door de volgende check:
PHP:
1
2
| if (mb_detect_encoding($s, "UTF-8", true) != "UTF-8") $s = utf8_encode($s); |
In de database staan alle velden op utf8_unicode_ci.
De uiteindelijke pagina voorzie ik van UTF8 door zowel de header mee te sturen:
PHP:
1
| header("Content-type: text/html; charset=utf-8"); |
...als in de meta-tags:
HTML:
1
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
De pagina geeft dan ook netjes de juiste "Tekenset", te weten utf8.
Nu gaat het echter al mis bij het plaatsen van de data in de database, de gebruikelijke "vreemde" tekens verschijnen al, dingen als: â€. Daarom ben ik gaan kijken wat bovenstaande check in php oplevert, maar die geeft keurig elke keer UTF-8 terug, dus:
code:
1
| echo 'mb_detect_encoding($s, "UTF-8", true):' . mb_detect_encoding($s, "UTF-8", true); |
geeft:
code:
1
| mb_detect_encoding($s, "UTF-8", true): UTF-8 |
Een voorbeeld van de bron waar het mis gaat is deze. De browser geeft als "Tekenset" UTF-8 maar in de xml staat:
XML:
1
| <?xml version="1.0" encoding="ISO-8859-1" ?> |
Kortom, het lijkt alsof die data niet UTF8 is, maar waarom vertelt mb_detect_encoding mij dan van wel?
Inmiddels ben ik zo week in de paasei geworden van dit probleem


