Speciale tekens verschijnen niet altijd correct
Ik zit met een klein probleempje en ik heb geen idee waar het aan ligt,
ik werk met een connectie tussen een flash file en een mysql database met daartussen een php bestand.
Ik probeer losse woorden op te slaan van de flash file naar de database, maar soms zitten daar speciale tekens tussen, geen probleem want dat heb ik opgelost met:
Code (php)
1
2
3
2
3
header ('Content-type: text/html; charset=utf-8');
$woord = mysql_real_escape_string($_GET['woord']);
$woord = utf8_decode ($woord);
$woord = mysql_real_escape_string($_GET['woord']);
$woord = utf8_decode ($woord);
(de database staat op utf8_general_ci )
En het meest vreemde vind ik dat het soms werkt en soms niet bijvoorbeeld als ik André invoer dan krijg ik in 95% van de gevallen "André" in mijn database en in de andere 5% "Andr?". Heeft iemand een idee of dit aan de php code ligt of aan de flash file?
Alvast bedankt!
- hoe maak je een verbinding met je database?
- EDIT doe je dit op verschillende plaatsen op verschillende manieren?
- wat jij hierboven aangeeft is een collation, geen character encoding; dat zijn twee compleet verschillende dingen
- heb je gelocaliseerd waar het probleem zit? werkt je code wel goed zonder tussenkomst van Flash?
Wat is character encoding
Ook in die thread Collation is niet hetzelfde als character encoding
Gewijzigd op 19/09/2015 14:59:04 door Thomas van den Heuvel
ik doe utf8_decode omdat ik van een iso character set kom en ik deze wil opslaan als utf8 in de database.
Ik denk dat de verbinding met de database correct is (en gebeurd slechts 1 keer) omdat in 95% van de gevallen het wel goed opslaat. Moet ik die utf8_decode weglaten dan?
Om eerlijk te zijn denk ik dat het probleem hem in de flash file zit aangezien het 95% van de keren goed gaat en slechts 5% fout gaat, maar ik vind ook geen fout in de flash file aangezien alles telkens op dezelfde manier opgeslagen wordt ...
Alvast bedankt!
Maar, en daarom vroeg ik hier naar, er kan nog meer aan de hand zijn met je database.
Stel dat je een UTF-8 tabel hebt (of liever gezegd, utf8, zoals MySQL UTF-8 noemt). Als je niet bij het maken van een verbinding met je database aangeeft via welke character encoding je wilt communiceren is er een grote kans dat MySQL de default latin1 pakt (dit is nagenoeg equivalent aan ISO-8859-1).
Maar omdat MySQL zelf ziet dat je vervolgens data wilt opslaan in een utf8 tabel zal deze zelf de latin1-encoded data omzetten naar utf8. Maar mogelijk was de aangeleverde data juist UTF-8 ge-encodeerd. MySQL voert dan dus een vertaling naar UTF-8 teveel uit. Daarom is het heel belangrijk dat je expliciet aangeeft in welke encoding je communiceert (via een _set_charset() functie of methode) en je ook zorg draagt dat de data die je aanlevert ook daadwerkelijk zodanig ge-encodeerd is.
Andersom, bij het uitlezen, gebeurt er iets soortgelijks: als jij een utf8-tabel hebt (hierbij nemen we ook aan dat de data in die tabel op een juiste wijze ge-encodeerd is) en je vraagt informatie op zonder dat je ook hier aangeeft wat de character encoding is waarin je wenst te communiceren, dan is wederom de kans groot dat de default "latin1" wordt gepakt. MySQL is dan wederom zo intelligent dat deze je utf8-data terugvertaalt naar latin1 (oftewel ISO-8859-1).
Mja, en als je dan vervolgens in je HTML-document een metatag of header zet met charset=UTF-8 dan ben je nat want de encodering van je document sluit dan niet aan bij de encodering van de data die je afdrukt...
EDIT: Het gaat ook "goed" zolang je maar niet de juiste character encoding instelt bij het maken van een connectie: bij het wegschrijven vindt een dubbele vertaling naar UTF-8 plaats, en bij het uitlezen van je data wordt deze dubbele vertaling weer ongedaan gemaakt, maar ondertussen is de data in je database wel in zekere zin corrupt. Deze corruptie komt pas naar voren als je op een juiste manier gaat communiceren met je database. Het kan dus best zijn dat Flash al op de juiste manier met je database communiceert, en je PHP-code niet.
Daarom vroeg ik ook: hoe communiceer je met je database: hoe sla je data op, hoe lees je data uit? Werkt dit ook zonder tussenkomst van Flash?
Ik heb eigenlijk nog steeds dezelfde vragen...
Gewijzigd op 20/09/2015 14:49:22 door Thomas van den Heuvel