Avatar billede andreas13_fam Nybegynder
14. marts 2009 - 13:00 Der 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
Avatar billede chr.kj Nybegynder
14. marts 2009 - 14:52 #1
Ret dit charset fra utf-8 til charset=iso-8859-1 så virker æøå
Avatar billede andreas13_fam Nybegynder
14. marts 2009 - 17:37 #2
Den køber jeg ikke i første omgang, da jeg så mange gange har hørt at man skal bruge uft-8.
Avatar billede skau Nybegynder
14. marts 2009 - 17:38 #3
Wow dit design virker ikke i firefox - teksterne står oveni hinanden
Avatar billede andreas13_fam Nybegynder
14. marts 2009 - 18:45 #4
Det virker fint på min computer, hvilken version er der tale om.
Det skulle meget gerne virke i FF 3, med mindre du har forstørret teksten.

Men hvordan løser jeg mit problem, uft-8 understøtter nemig æøå.
Avatar billede andreas13_fam Nybegynder
14. marts 2009 - 18:59 #5
Det virker fint når det er lavet som &noget;
Er der så nogen der kender en funktion som konventere til det, ellers må jeg i gang med preg_replace();
Avatar billede skau Nybegynder
14. marts 2009 - 19:03 #6
Sidder i en ubuntu med firefox 3.noget
Avatar billede andreas13_fam Nybegynder
14. marts 2009 - 19:08 #7
Hmm det giver selvfølgelig problemmer med alfabetisk sortering.
Avatar billede erikjacobsen Ekspert
14. marts 2009 - 19:29 #8
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.
Avatar billede andreas13_fam Nybegynder
14. marts 2009 - 21:44 #9
@erikjacobsen, hvilken del af min side er iso-8859-1
Mit mål er at køre utf-8
Avatar billede erikjacobsen Ekspert
14. marts 2009 - 21:48 #10
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.
Avatar billede andreas13_fam Nybegynder
14. marts 2009 - 22:38 #11
Jamen så har jeg en teori, jeg skal teste imorgen.
Avatar billede chr.kj Nybegynder
15. marts 2009 - 09:58 #12
"Den køber jeg ikke i første omgang, da jeg så mange gange har hørt at man skal bruge uft-8. "

Jamen selv tak for hjælpen.. Du er da en man virkelig har lyst til at hjælpe!!
Avatar billede andreas13_fam Nybegynder
15. marts 2009 - 11:18 #13
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.
Avatar billede andreas13_fam Nybegynder
15. marts 2009 - 11:22 #14
og jeg beklager da hvis det har påvirket dig negativt.
Avatar billede chr.kj Nybegynder
15. marts 2009 - 11:53 #15
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".
Avatar billede andreas13_fam Nybegynder
15. marts 2009 - 12:24 #16
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.
Avatar billede andreas13_fam Nybegynder
15. marts 2009 - 12:38 #17
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.
Avatar billede erikjacobsen Ekspert
15. marts 2009 - 12:52 #18
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.
Avatar billede andreas13_fam Nybegynder
15. marts 2009 - 17:29 #19
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
Avatar billede erikjacobsen Ekspert
15. marts 2009 - 17:33 #20
Måske var det en idé at fortælle hvordan du sorterer?
Avatar billede andreas13_fam Nybegynder
15. marts 2009 - 18:27 #21
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
Avatar billede erikjacobsen Ekspert
15. marts 2009 - 18:47 #22
Og din collation - altså sorteringsorden - er ...?
Avatar billede andreas13_fam Nybegynder
15. marts 2009 - 20:01 #23
ASC. Men jeg er faktisk ikke sikker på at jeg forstår dit spørgsmål.
Avatar billede andreas13_fam Nybegynder
15. marts 2009 - 20:18 #24
Nu forstod jeg det :D
det er utf8_danish_ci
Avatar billede erikjacobsen Ekspert
16. marts 2009 - 10:50 #25
Så er det vist det resultat du får.

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.
Avatar billede andreas13_fam Nybegynder
16. marts 2009 - 15:37 #26
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.
Avatar billede andreas13_fam Nybegynder
16. marts 2009 - 16:54 #27
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 ë
Avatar billede andreas13_fam Nybegynder
16. marts 2009 - 20:59 #28
Er der overhoved en let løsning, eller bliver man nød til at gå over til ISO indtil UTF-8 (dansk) er ordentligt understøttet i MySQL.
Avatar billede erikjacobsen Ekspert
16. marts 2009 - 21:03 #29
Den funktion du anfører konverterer fint fx ë eller é i utf-8 til iso-8859-1. Har du et lille eksempel, der ikke virker?
Avatar billede andreas13_fam Nybegynder
17. marts 2009 - 07:50 #30
Det var mig der var en klods, det virker nu udgående så må jeg se om det virker indgående
Avatar billede andreas13_fam Nybegynder
17. marts 2009 - 12:27 #31
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';
}
Avatar billede andreas13_fam Nybegynder
17. marts 2009 - 12:50 #32
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
Avatar billede andreas13_fam Nybegynder
17. marts 2009 - 14:03 #33
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);
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