Gå til innhold

MySQL forandrer "æ", "ø" og "å"


Anbefalte innlegg

Hei,

 

jeg driver å programmerer et nettsted der man kan laste opp bilder og kommentere på disse (et slags mini-deviantArt, om du vil). Det meste går på skinner, men idag oppdaget jeg et problem som begynner å gå meg på nervene.

 

Når PHP sender kommentarer, beskrivelser o.l. til MySQL-databasen, forandres alle "æ", "ø" og "å" (og sannsynligvis også andre bokstaver som ikke er like vanlige) til rare kombinasjoner av bokstaver ("Ã¥", "ær", "ø"). Når man henter informasjonen tilbake til nettsiden (altså fra MySQL-databasen til nettleseren via PHP) vises imidlertid disse bokstavene slik de gjerne bør, men jeg bekymrer meg for at dette kan bli et problem ved en senere annledning og at jeg bør rydde opp i det før databasen blir altfor stor.

 

I forbindelse med dette har jeg lest en hel del om character sets og character encoding, uten å egentlig komme noen vei. Jeg forstod det imidlertid slik at absolutt alt som har med hverandre å gjøre bør benytte samme character encoding, og forandret MySQL-databasen min fra latin_1 (ISO, altså) til UTF-8 Unicode i håp om at dette ville hjelpe. Det gjorde det imidlertid ikke. Faktisk ble det værre, ettersom nye innlegg som inneholder "æ", "ø" og "å" nå vises i nettleseren som "Ã¥", "ær", "ø" mens de i databasen består av andre rare kombinasjoner som jeg gjennkjenner som HTML entities ("Ã¥").

 

Jeg skjønner altså ingen ting, og håper at noen her kanskje kan forklare hva som egentlig foregår.

 

mvh,

Johannes.

 

PS: Jeg benytter "<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />" i alle HTML-dokumentene mine, og de er også arkivert som UTF-8 (no BOM). Tekst som inneholder "æ", "ø" og "å" fra PHP og innhold forøvrig fungerer fint, og vises på riktig måte.

Endret av JGorset
Lenke til kommentar
Videoannonse
Annonse

Når eg aldri finn utav det bruker eg berre å gjøre noko eg kaller eit "triks". Gjer meg meir jobb men. Bytt ut ÆØÅ med følgande om du ikkje finn noko løysning:

 

Æ = Æ

Ø = Ø

Å = Å

 

Skal du ha dei små skriv du berre ae istaden for AE, o istaden for O, og a istaden for A.

Lukke til ;)

 

Somsagt; dette er berre ei nødløsning. Du bør finne ut KVIFOR problemet oppstår.

Lenke til kommentar
Når PHP sender kommentarer, beskrivelser o.l. til MySQL-databasen, forandres alle "æ", "ø" og "å" (og sannsynligvis også andre bokstaver som ikke er like vanlige) til rare kombinasjoner av bokstaver ("Ã¥", "ær", "ø"). Når man henter informasjonen tilbake til nettsiden (altså fra MySQL-databasen til nettleseren via PHP) vises imidlertid disse bokstavene slik de gjerne bør, men jeg bekymrer meg for at dette kan bli et problem ved en senere annledning og at jeg bør rydde opp i det før databasen blir altfor stor.e.

 

Du har vel totalt 5 charsets involvert tipper jeg. Hvis vi begynner i den ene enden...

 

a) Selve databasen har ett charset.

b) Database-forbindelsen kan ha ett charset (mulig den f.eks alltid er samme som databasen med MySQL, usikker)

c) PHP-scriptene og websiden har ett charset

d) HTML-koden er tagget med ett charset.

e) Browseren har ett charset.

 

(litt simplifisert)

 

I dag vil jeg stort sett anbefale at man prøvre å standardisere på UTF-8, dersom man ikke har spesifikk grunn til noe annet.

 

Jeg kan nevne at "Ã¥" sansynligvis er 'æ' lagret i UTF-8, men vist som Latin-1. Dette blir jo en god suppe etterhvert.

 

Jeg tipper det som har skjedd er at du har satt inn UTF-8 data i en Latin-1-database. Når du så har sett på innholdet f.eks med MySQL klienten, så har det blitt vist som doble tegn, altså som Latin-1.

 

Du sitter da med UTF-8 i en Latin-1-database. Hvis du så f.eks eksporterer denne, for så å lage en ny database som heter det samme, med som er UTF-8, og importerer data, så blir du sittende med Latin-1, som egentlig er UTF-8, men er lagret som Latin-1 i en UTF-8 database.... Hmm, inta bra.

 

;)

 

Hvis ikke databasen er veldig stor, så tror jeg det enkleste er å eksportere den første databasen du hadde, altså den med UTF-8 lagret i en Latin-1 database. Eksporten kan du gjøre som SQL. Hvis du da redigerer dumpen, og endrer charset-infoen fra Latin-1 til UTF-8, og så henter den inn igjen, så burde du lese inn UTF-8 som UTF-8 inn i en UTF-8 database.

Lenke til kommentar

Hei terjeelde,

 

fulgte forslaget om å redigere MySQL-dumpen av databasen da den fortsatt var latin1 med UTF-8 innhold ved å erstatte alle de rare bokstavene med "æ", "ø" og "å" og endre charset, men dette fungerer desverre ikke. Bokstavene vises riktignok slik de skal være i MySQL-databasen, men når de hentes av PHP til nettleseren blir de simpelthen borte ("møte" blir f.eks. til "mte"). Nye innlegg som inneholder "æ", "ø" og "å" blir fortsatt forandret til HTML entities i MySQL-databasen ("ø æ Ã¥"), og vises i nettleseren som "ø æ Ã¥".

 

Altså: Alle dokumenter er fortsatt UTF-8 (no BOM), og benytter dessuten "<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />" for å forsikre at nettleseren ikke tar feil. MySQL-databasen er nå UTF-8 med UTF-8 innhold, ettersom jeg forandret alle "ø æ Ã¥" med "æ", "ø" og "å" og endret charset til UTF-8 (eller "utf8" i MySQL).

 

Jeg definerer imidlertid ikke charset i en PHP header(), men ettersom jeg benytter PHP 5.x er vel ikke dette nødvendig, siden denne er UTF-8 native?

 

Jeg kan nevne at "Ã¥" sansynligvis er 'æ' lagret i UTF-8, men vist som Latin-1. Dette blir jo en god suppe etterhvert.

 

Dette er rart, siden nettstedet nå altså viser "ø" der MySQL-databasen inneholder "Ã" - jeg er imidlertid sikker på at nettleseren viser alt i UTF-8, ettersom alle dokumenter er UTF-8 (no BOM) og til og med er sikret med en HTML header?

Endret av JGorset
Lenke til kommentar
Dette er rart, siden nettstedet nå altså viser "ø" der MySQL-databasen inneholder "Ã" - jeg er imidlertid sikker på at nettleseren viser alt i UTF-8, ettersom alle dokumenter er UTF-8 (no BOM) og til og med er sikret med en HTML header?

 

Ta en rask sjekk av HTML-dokumentet. Er det tagget som UTF-8?

 

Det jeg tror kanskje skjer er at MySQL databasen og data er UTF-8, men forbindelsen til MySQL er Latin-1, slik at MySQL konverterer fra UTF-8 til Latin-1 før den gir data til PHP.

 

Ikke sikker, men er verdt å sjekke.

 

(jeg bruker ikke MySQL og PHP selv, så bygger på erfaring fra andre lignende systemer og feil)

Lenke til kommentar
Ta en rask sjekk av HTML-dokumentet. Er det tagget som UTF-8?

 

Det jeg tror kanskje skjer er at MySQL databasen og data er UTF-8, men forbindelsen til MySQL er Latin-1, slik at MySQL konverterer fra UTF-8 til Latin-1 før den gir data til PHP.

 

Ikke sikker, men er verdt å sjekke.

 

(jeg bruker ikke MySQL og PHP selv, så bygger på erfaring fra andre lignende systemer og feil)

 

 

Samtlige PHP-dokumenter (som altså inneholder HTML) er tagget som Unicode UTF-8 (no BOM). Du kan ha rett ang. forbindelsen PHP har med MySQL, men jeg aner ikke hvordan jeg evt. kan forandre denne - har du?

Endret av JGorset
Lenke til kommentar
Samtlige PHP-dokumenter (som altså inneholder HTML) er tagget som Unicode UTF-8 (no BOM). Du kan ha rett ang. forbindelsen PHP har med MySQL, men jeg aner ikke hvordan jeg evt. kan forandre denne - har du?

 

Du kan kanskje prøve mysql_set_charset-funksjonen.

 

http://no.php.net/manual/en/function.mysql-set-charset.php

 

Hvis du setter til UTF-8, så håper jeg ting virker. Ellers får vi legge hodet i bløt igjen. ;)

Lenke til kommentar
Du kan kanskje prøve mysql_set_charset-funksjonen.

 

http://no.php.net/manual/en/function.mysql-set-charset.php

 

Hvis du setter til UTF-8, så håper jeg ting virker. Ellers får vi legge hodet i bløt igjen. ;)

 

Min installasjon av PHP (5.2.6) støtter tydeligvis ikke mysql_set_charset-funksjonen (som forsåvidt er underlig, siden PHP.net hevder at PHP 5.2.3 og senere gjør det), ettersom serveren gir feilmeldingen "call to undefined function mysql_set_charset" når jeg forsøker å bruke denne. Har imidlertid forsøkt disse variantene, som sies å gjøre noe lignende (det er så frustrerende å forstå alt sånn ca. halvveis - føler at jeg roter rundt i blinde)...

 

mysql_query("SET NAMES 'utf8'");

mysql_query("SET CHARACTER SET utf8 ");

 

Nå vises "æ", "ø" og "å" riktig (!!!). I nye innlegg blir desverre disse bokstavene fortsatt forandret til HTML-entities.

 

Jeg setter forresten veldig pris på at du legger hodet i bløt med meg. :)

Endret av JGorset
Lenke til kommentar
Nå vises "æ", "ø" og "å" riktig (!!!). I nye innlegg blir desverre disse bokstavene fortsatt forandret til HTML-entities.

 

Grattis! :)

 

Når det gjelder HTML-entities, så er jeg litt på tynn is... Vet du om det er PHP, MySQL-biblioteket, eller browseren som gjør dem til HTML-entities?

 

Jeg setter forresten veldig pris på at du legger hodet i bløt med meg. :)

 

"Been there, done that", så vet hvor plagsomt det kan være med slike ting. :)

Lenke til kommentar
Grattis! :)

 

Når det gjelder HTML-entities, så er jeg litt på tynn is... Vet du om det er PHP, MySQL-biblioteket, eller browseren som gjør dem til HTML-entities?

 

Jeg tror nok det er MySQL som forandrer bokstavene, ettersom nettleseren og PHP viser "æ", "ø" og "å" slik de skal til alle døgnets tider. Det ser også ut til at PHP leser informasjon fra MySQL greit nå, siden oppføringene jeg forandret til "æ", "ø" og "å" nå vises korrekt på nettsiden. Problemet ser ut til å være at PHP eller MySQL insisterer på å forandre disse bokstavene til HTML-entities når bokstavene legges inn i databasen. Hvis noen vet hvorfor og hvordan, tror jeg problemet omsider kan løses!

Endret av JGorset
Lenke til kommentar

VOILA!

 

Det viser seg at PHP setter inn HTML entities i PHP fordi en "htmlentities()" har sneket seg inn i koden min for å forhindre bruk av HTML i kommentarer. Det er imidlertid forvirrende og frustrerende at denne funksjonen tydeligvis ikke klarer å håndtere norske bokstaver på riktig måte, ettersom "ø" absolutt ikke er "å". Dette skal jeg imidlertid alltids kunne finne en råd med (edit: htmlspecialchars-funksjonen gjorde susen).

 

Takk for hjelpen!

Endret av JGorset
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...