14. marts 2009 - 13:00Der er
32 kommentarer og 1 løsning
Fejl ved særlige tegn når der hentes data fra MySQL
Når jeg henter data fra MySQL ind i mine php filer bliver særlige tegn (fx æøå) vist som [?] eller hvad der nu er symbolet for ukendt tegn. Mine filer er i UTF-8 (de fleste uden BOM). De har alle denne <meta>: <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> Det er html 4.01 Min database er gemt som utf8_danish_ci Mine tabellere inden i er gemt som utf8_danish_ci Mine kolonner er gemt som utf8_danish_ci I MyPHPadmin kan man fint se æøå og alle de andre særlige tegn. Et godt eksempel på problemet er her: http://www.netkogeren.a-mweb.dk/index.php?Opskrift=40
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
På det link du har i spørgsmålet, blander du utf-8 og iso-8859-1. Dvs. du har begge slags tegn på siden.
Uanset hvad du vælger, så skal du være konsekvent og konsistent, eller hvad det nu hedder.
Og ja, man kan bruge iso-8859-1 på websider. Hvis man håndterer tekster i JavaScript, så kan der måske være problemer - men det behøver man måske heller ikke.
Det der står med ?-tegn, ser ud til at være iso-8859-1. Og det er vist hvad der kommer fra databasen. Du skal kigge på det sted, du putter data i databasen.
Jemen du tager det da også lidt personligt nu ("i første omgang"). Men hvis der ikke skal mere til for at få dig i dårligt humør så tror jeg også at der bedst du ikke hjælper mig.
Har rent faktisk fundet en løsning til dig, men jeg må indrømme at med dine bemærkninger tror jeg egentlig bare at jeg beholder den for mig selv. Det er der undre mig er, at du beder om hjælp og når der så er nogle der forsøger at hjælpe takker du dem ikke engang for deres forsøg hvis du mener at svaret/kommentaren ikke er løsningen på dit problem. Men fortsat god dag og jeg håber at du selv finder løsningen på dit problem, eller at der er andre der har lyst til at hjælpe for jeg er i hvert fald "off".
Hvis "i første omgang" og "beklager" ikke kan gøre sagen god igen så kan intet vist.
Når men det er lykkes mig at få de rigtige tegn nu, jeg har dog stadig problemer med at sortere alfabetisk, og få if (preg_match("/^[A-ZÆØÅ]$/", $row['navn'])) til at reagere på ÆØÅ, er der en venlig sjæl der kan hjælp mig med det.
PS: jeg skulle selvfølgelig have takket for dit forsøg på at hjælpe mig. Men nu hvor jeg har brugt så meget tid på at skifte til utf-8 så var det bare ikke det lige det jeg ville høre.
Det er så problemet med PHP, at det ikke af sig selv ved noget om utf-8. Derfor kan du bruge funktionerne fra http://php.net/mbstring - hvor du husker at angive utf-8 passende steder.
Ja der var da mange nytige funktioner, men ikke lige noget der kunne klare if (preg_match("/^[A-ZÆØÅ]$/", $row['navn'])). Så det har jeg bare hardkodet ind med id. Men problemmet med sortering er der stadig: http://www.netkogeren.a-mweb.dk/index.php?soeg=opskrift
Det var da en rigtig god ide :D Det går jeg ganske simpelt med "ORDER BY navn". Hvor navn er overskriften på opskriften. fx: SELECT * FROM opskrifter ORDER BY navn
Det er en sølle lille lus mellem to negle. Trods mange diskussioner har MySql ikke lavet en sorterings-collation, der "passer" til dansk, som vi forventer det.
Tillige kan PHP ikke rigtig håndtere unicode og utf-8, så det er ikke nemt at få det sorteret i PHP. PHP6 skal efter sigende have langt bedre unicode understøttelse - så langt er jeg ikke kommet.
Et lille hack: lave en konverteret kopi af feltet i iso-8859-1 i PHP, og lav din sortering der. Men udskriv utf-8 værdien.
hmm jeg tror at jeg vil beholde databasen i iso-8859-1, og så konvertere frem og tilbage med mb_convert_encoding($string, "ISO-8859-1", "UTF-8"); mb_convert_encoding($string, "UTF-8", "ISO-8859-1"); Så bliver det interessant om den kan konvertere et helt arrya.
ja det virker åbenbart ikke. når man prøver med mb_convert_encoding($row['navn'], "ISO-8859-1", "UTF-8") så forsvinder særlige tegn bare. Min database er i latin1_danish_ci, og det er lagt ind med: header('Content-type: text/html; charset=ISO-8859-1'); fra min backup fil.
Har du nogen ide til hvorfor den fjerner særlige tegn, fx Champignon-pat er med ë
Til arktivet: mb_convert_encoding kan ikke klare et helt array, men jeg har held med at gøre sådan. I min indstillingsfil har jeg denne (en liste over kolonner i en tabel) $con_opskrifter = array("navn","tekst");
Jeg har så denne while der udskriver MySQL data
while($row = mysql_fetch_assoc($query)) { foreach ($con_opskrifter as $convert) { $row[$convert] = mb_convert_encoding($row[$convert], "UTF-8", "ISO-8859-1"); } unset($convert); echo $row['noget'].'conventeret fra ISO til UTF-8'; }
Omvendt når man skal lave en forespørgsel til MySQL, så for jeg det til at virke sådan: mysql_query(mb_convert_encoding($query, "ISO-8859-1", "UTF-8"))
------------ Jeg har derfor ikke flere problemer nu. Husk at databasen skal være utf8_danish_ci
Og så siger jeg mange gange tak for hjælpen erikjacobsen
Lidt mere elegant: foreach ($row as $con_name => $con_value) { $row[$con_name] = mb_convert_encoding($con_value, "UTF-8", "ISO-8859-1"); } unset($con_name,$con_value);
Synes godt om
Ny brugerNybegynder
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.