06. juli 2008 - 21:04Der er
9 kommentarer og 1 løsning
PHP, UTF-8, MYSQL og character problem
Hej Jeg har et stort problem hvad angår characters, som jeg snart har siddet med et par dage, uden at kunne finde svar på noget. Min side er opbygget i html/php og jeg bruger UTF-8. Det virker fint, og alle characters som æøå vises helt fint uden problemer, når de er skrevet i selve filen. Problemet er bare at når jeg henter æøå fra min mysql database, så opstår der fejl!
Hvis jeg poster fra en form på min side, så indsættes æøå som æøå i databasen. Dette vises korrekt på siden, men kan det passe, at der skal stå æøå i databasen, og ikke æøå? Fordi f.eks. når jeg vil udskrive et feed, så viser den ikke æøå, men æøå.
Hvis jeg nu indsætter æøå manuelt i databasen, så vises dette som ��� på min side, men hvis jeg f.eks. udskriver det til et feed og ser dette feed via google fead reader, så viser den nu æøå.
Hvad er det korrekte at gøre? Min database og tabeller burde være sat op til at køre utf-8.
Din "fejl" er sikkert at tegnsættet der bliver brugt til forbindelsen er latin1, fremfor utf8. Det gør at MySQL ikke har læst det som æ, ø og å, men netop æ, ø og Ã¥. Fordi det samme er problemet når du henter det ud igen, vil det ende med at virke for det der er sat "forkert" ind - PHP er nemlig ikke klar over hvilket tegnsæt forbindelsen kører med, så den tager bare det den får ud.
Det kan fixes ved at køre en SET NAMES 'utf8'; umiddelbart efter man opretter forbindelse - så vil MySQL outputte data som UTF-8 - men det gør desværre at de eksisterende data ikke vil komme korrekt ud - fordi den har troet den indsatte latin1 i sin tid.
For at komme udenom DET problem, skal du hente et komplet dump, åbne i en UTF-8 kompatibel editor, kopiere det ud, gemme som ANSI, og så importere igen - så skulle det rette op på alt det der er indsat via PHP.
Det du har indsat manuelt vil dog være forkert efter dette. Du skal selv rette op på dette - enten ved at rette i dit dump (så det er UTF-8-koderne der står der i stedet for æ, ø, å), eller ved at rette op på det bagefter.
HUSK i øvrigt at gemme en backup, i tilfælde af der går noget galt når du vil hente ind igen *-)
Det er et helt nyt projekt, så der er faktisk ikke rigtig noget data der skal bruges, har kun en masse dummy data i min database. Så jeg har heldigvis ikke noget data liggende i latin1 som jeg skal bruge.
Jeg har lige prøvet med SET NAMES og jeg tror faktisk dette er løsningen på mit problem!!! Jeg vender lige tilbage :) Du har virkelig reddet weekenden hvis det er.
Det kunne man måske tro, men PHP har intet begreb om at siden er UTF-8 - eller for den sags skyld hvad det svarer til hos MySQL (ISO-8859-1 hedder jo latin1 i MySQL) *-)
I de fleste "moderne" sprog håndteres det problem ved at driverne (dvs. det kode der står for reelt at snakke med databasen) altid bruger Unicode - men det er så også fordi de sprog understøtter Unicode. Det gør PHP ikke - den tager gerne mod Unicode-data, men den ved ikke noget om at det er det det er.
Jeg vil gætte på PHP6 ændrer på den situation (når den engang kommer), da den understøtter Unicode, og den så konverterer internt som der er behov for det - men jeg ved det selvfølgelig ikke med sikkerhed.
Ahh oki på den måde.. Det er lige med at få styr på det hele, og alle begreberne omkring det med tegnsæt. Det er ikke helt ligetil synes jeg.
Men SET NAMES virker i hvert fald lige som det skal! - Bortset fra med RSS feeds. Jeg udskriver feeds vha. et php script. Uden SET NAMES, så virker feedet slet ikke i IE 7.0 men vises perfekt i Firefox. Efter indsættelse af SET NAMES så virker feedet perfekt i IE 7.0, mens Firefox så har character problems. Har du en ide om hvad dette skyldes?
Jeg gætter på det ikke bare er fordi du har angivet forkert tegnsæt i XML-prologen, og så har jeg ikke lige nogen umiddelbar ide - det ville kræve jeg så feedet.
Så har jeg lige været inde og kigge. Mit feed validerer, men den kommer med en warning:
Your feed appears to be encoded as "utf-8", but your server is reporting "ISO-8859-1", og det er jo nok her fejlen opstår. Har følgende linjer i mit feed der burde encode feedet i utf-8:
header('Content-type: type/xml; charset=utf-8'); og $output = '<?xml version="1.0" encoding="utf-8"?>';
Ved du hvad jeg ellers kan gøre for at serveren ikke siger ISO-8859-1? Sig til hvis du skal bruge hele feedet.
Hej igen Jeg løste problemet ;) Det var en lille fejl i gentagelse af header. Men tak for hjælpen igen.
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.