Avatar billede nicker Nybegynder
06. juli 2008 - 21:04 Der 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.
Avatar billede nicker Nybegynder
06. juli 2008 - 21:05 #1
���  = 3 firkanter
Avatar billede pidgeot Nybegynder
06. juli 2008 - 21:16 #2
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 *-)
Avatar billede nicker Nybegynder
06. juli 2008 - 21:39 #3
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.
Avatar billede nicker Nybegynder
06. juli 2008 - 21:45 #4
Det virker!!! Mange mange tak. :) Lægger du et svar?

Hvordan kan det være at man skal køre SET NAMES for at det virker. Burde forbindelsen ikke automatisk være utf-8, når siden er utf-8?
Avatar billede pidgeot Nybegynder
06. juli 2008 - 21:51 #5
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.
Avatar billede nicker Nybegynder
06. juli 2008 - 22:07 #6
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?
Avatar billede pidgeot Nybegynder
06. juli 2008 - 22:22 #7
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.

Check det evt. op mod http://feedvalidator.org/, det kan være det afslører fejlen.
Avatar billede nicker Nybegynder
07. juli 2008 - 12:38 #8
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.
Avatar billede pidgeot Nybegynder
07. juli 2008 - 13:10 #9
Det bliver jeg nok nødt til, ja - men hvis du har den header før noget output, kan jeg ikke umiddelbart se hvorfor den skulle kunne melde andet.
Avatar billede nicker Nybegynder
10. juli 2008 - 10:38 #10
Hej igen
Jeg løste problemet ;) Det var en lille fejl i gentagelse af header. Men tak for hjælpen igen.
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