Gå til innhold

[Løst] Bokstavene æ, ø og å forsvinner i databasen


Anbefalte innlegg

Dette er vel et ganske kjent problem, men et problem jeg ikke klarer å løse etter 1 døgn med kun feiling nå. Jeg skal beskrive hvordan alt ligger til:

 

Jeg bruker en Linux server hos uniweb. Der har jeg ordnet meg en database hvor jeg overfører alt av registeringsinformasjon til. Men hver gang databasen registrerer en æ, ø eller å, så forsvinner alt av tekst som kommer etter bokstaven.

 

Det er satt opp slik:

phpMyAdmin

------------------------------------------------------------------

Kollasjon av MySQL-oppkobling: utf8_danish_ci

 

Tabell: utf8_danish_ci

database: uft8_general_ci

-------------------------------------------------------------------

 

Hva gjør jeg feil her? Hvis jeg setter det på latin1 så blir det spørsmålstegn istedet for at æ, ø og å forsvinner, samtidlig som at teksten bak bokstaven blir med.

Endret av FreeZeMan83
Lenke til kommentar
Videoannonse
Annonse

Først og fremst; jeg tror du tenker i riktig retning.

 

Det jeg - uten å ha tenkt veldig nøye gjennom - tror kanskje skjer her, er at du har bare fått full kontroll over deler av bildet.

 

Database: UTF8

men det er også spørsmål om:

Tegnsett mellom program og database.

Tegnsett mottatt av f.eks webserver.

 

Det som fort kan skje er f.eks at du får tekst i Latin-1, prøver å legge det i en utf-8-database, og så får du problemer.

 

Eller enda værre, du kan få utf-8 fra klient, prøve å snakke med latin-1 mot databasen, som prøver å lagre utf-8.

 

Enkelt og greit, så er det mange potensielle problemer og problemkilder.

 

Det beste er gjerne å standardisere på noe (f.eks utf8), og så sjekke all tekst som kommer inn opp mot dette. De fleste språk har et eller flere bibliotek for å kunne gjette hva en tekst er skrevet i.

 

F.eks sjekke om det ser ut som gyldig utf8, om det ikke er det, sjekke om det ser ut som latin-1, osv.

Lenke til kommentar

Først og fremst; jeg tror du tenker i riktig retning.

 

Det jeg - uten å ha tenkt veldig nøye gjennom - tror kanskje skjer her, er at du har bare fått full kontroll over deler av bildet.

 

Database: UTF8

men det er også spørsmål om:

Tegnsett mellom program og database.

Tegnsett mottatt av f.eks webserver.

 

Det som fort kan skje er f.eks at du får tekst i Latin-1, prøver å legge det i en utf-8-database, og så får du problemer.

 

Eller enda værre, du kan få utf-8 fra klient, prøve å snakke med latin-1 mot databasen, som prøver å lagre utf-8.

 

Enkelt og greit, så er det mange potensielle problemer og problemkilder.

 

Det beste er gjerne å standardisere på noe (f.eks utf8), og så sjekke all tekst som kommer inn opp mot dette. De fleste språk har et eller flere bibliotek for å kunne gjette hva en tekst er skrevet i.

 

F.eks sjekke om det ser ut som gyldig utf8, om det ikke er det, sjekke om det ser ut som latin-1, osv.

 

Har selv tenkt mye på dette med tegnsettet mellom program og database, men kan veldig lite rundt slikt. Har selv denne meta-taggen på nettsidene: <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

 

Og den eneste måten jeg har sjekket ut teksten før den har blitt overført til databasen er med 'echo' kun for å se om æ, ø og å fortsatt var med, som de jo var. Synes bare det er rart at bokstavene forsvinner og kommer ikke med noen former for andre tegn.

 

I databasen så er de char[20], med utf8_danish.ci

Endret av FreeZeMan83
Lenke til kommentar

Har selv tenkt mye på dette med tegnsettet mellom program og database, men kan veldig lite rundt slikt. Har selv denne meta-taggen på nettsidene: <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

 

Dette er en veldig knotete del av utvikling, og de fleste trenger litt tid på å lese seg opp om ting når de kommer ut for denne typen problemstilling, så du er langt fra alene. ;)

 

Content-Type i nettsidene sier noe om hvilke charset som brukes i HTMLen på selve nettsidene, men ikke nødvendigvis noe om hva du får tilbake fra en browser.

 

Og den eneste måten jeg har sjekket ut teksten før den har blitt overført til databasen er med 'echo' kun for å se om æ, ø og å fortsatt var med, som de jo var. Synes bare det er rart at bokstavene forsvinner og kommer ikke med noen former for andre tegn.

 

echo viser at de er med, men om de er "riktig" avhenger av setup på f.eks terminal-programmet ditt. De kan vises riktig der, men fortsatt være "feil" for databasen.

 

PHP har en funksjon som heter mb_detect_encoding. Jeg bruker ikke PHP selv lenger, men såvidt jeg kan se virker den riktig. Hvis du bruker den på teksten du får fra browser, så vil den forsøke å gjette tegnset. Du kan også bruke mb_convert_encoding for å konvertere teksten til det MySQL vil ha.

 

 

Begynner å bli en stund siden jeg har brukt PHP, men det er mulig du rett og slett kan gjøre noe sånt som:

 

$my_text = mb_convert_encoding( $my_text, "UTF-8", "UTF-8, UCS-4, UCS-2, UTF-32, UTF-16, ISO-8859-1" );

 

Med litt flaks bør PHP da kunne gjette seg frem til hvilke av de alternative character encodingene som er riktig, og konvertere $my_text til UTF-8.

 

Tenker det kan være verdt et forsøk. Om ikke det virker, så ville jeg sjekket om database-linken til MySQL, ikke bare selve databasen *i* MySQL, er satt med riktig encoding.

Endret av terjeelde
  • Liker 1
Lenke til kommentar

Dette er en veldig knotete del av utvikling, og de fleste trenger litt tid på å lese seg opp om ting når de kommer ut for denne typen problemstilling, så du er langt fra alene. ;)

 

Content-Type i nettsidene sier noe om hvilke charset som brukes i HTMLen på selve nettsidene, men ikke nødvendigvis noe om hva du får tilbake fra en browser.

 

 

 

echo viser at de er med, men om de er "riktig" avhenger av setup på f.eks terminal-programmet ditt. De kan vises riktig der, men fortsatt være "feil" for databasen.

 

PHP har en funksjon som heter mb_detect_encoding. Jeg bruker ikke PHP selv lenger, men såvidt jeg kan se virker den riktig. Hvis du bruker den på teksten du får fra browser, så vil den forsøke å gjette tegnset. Du kan også bruke mb_convert_encoding for å konvertere teksten til det MySQL vil ha.

 

 

Begynner å bli en stund siden jeg har brukt PHP, men det er mulig du rett og slett kan gjøre noe sånt som:

 

$my_text = mb_convert_encoding( $my_text, "UTF-8", "UTF-8, UCS-4, UCS-2, UTF-32, UTF-16, ISO-8859-1" );

 

Med litt flaks bør PHP da kunne gjette seg frem til hvilke av de alternative character encodingene som er riktig, og konvertere $my_text til UTF-8.

 

Tenker det kan være verdt et forsøk. Om ikke det virker, så ville jeg sjekket om database-linken til MySQL, ikke bare selve databasen *i* MySQL, er satt med riktig encoding.

 

Å gjett om det fungerte da med mb_convert_encoding, den var ikke dum nei. Da kan jeg bare sørge for å bruke den for hver tekst som skal overføres til databasen. SUPERT :woot:

 

Takker så mye for hjelpen, har aldri klart dette uten god hjelp ;)

Endret av FreeZeMan83
Lenke til kommentar

Å gjett om det fungerte da med mb_convert_encoding, den var ikke dum nei. Da kan jeg bare sørge for å bruke den for hver tekst som skal overføres til databasen. SUPERT :woot:

 

Kjempebra. :)

 

Bare slenger til at det kan være lurt å kjøre en tilsvarende konvertering når du sender ting mot web. F.eks hvis HTML-sidene er iso-8859-1, så er det greit at tekststrenger fra MySQL også er det.

 

Disse tingene er knotete for bortimot alle og enhver, så akkurat på disse tinga er det bare en fryd å hjelpe. :)

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...