Avatar billede sprimdal Nybegynder
30. juli 2010 - 11:12 Der er 11 kommentarer og
1 løsning

PHP + json encode æøå

Hej,
Jeg sider med et lille problem som i sikkert har hørt om flere gange , så her kommer det.

Jeg har en php kode som skal levere en json objekt som skal hentes fra et andet sted.
Jeg henter data fra en mysql database om sætter det i et string-array og derefter encoder jeg det til json. Men alle de strenge som indeholder æøå bliver til "null".
'Koden er som følger.

<?php
include 'config.php';
include 'opendb.php';

  $result = mysql_query("SELECT * FROM Json  ");
    while($row = mysql_fetch_array($result)){
    $arr[] =  array('id'=>$row[Navn]);        
        echo $row[Navn]; // Kun til fejlsøgning ( fjernes )
    }

echo json_encode($arr);
mysql_close()
?>


Output :  ( Jeg har sat "" om navne så det er lidt lettere at se)

"Søren Primdal" "Jan Søe" "Helle Skov" Primdal" "Henrik Sørnsen" "Søren Kirkegaard" "Svend Larsen" "Katja K" "Lars Christiansen"

[{"id":null},{"id":null},{"id":"Helle Skov Primdal"},{"id":null},{"id":null},{"id":"Svend Larsen"},{"id":"Katja K"},{"id":"Lars Christiansen"}]

Som i kan se så får jeg alle navne ud rigtigt, men når jeg encoder den bliver nogle til null....

What to do ??

/Søren
Avatar billede erikjacobsen Ekspert
30. juli 2010 - 11:46 #1
Og det du henter fra databasen har æøå i UTF-8 ?
Avatar billede sprimdal Nybegynder
30. juli 2010 - 12:08 #2
Hej,
Altså databasen ser sådan ud :


id    int(11)            Nej        auto_increment                           
Navn    varchar(25)    utf8_danish_ci        Nej                                   
Note    varchar(150)    utf8_danish_ci        Nej   

Jeg kan jo også se at jeg får æøå med ud, for mig ser det ud som om det først kommer ved encodeningen ??... men jeg kan tage fejl.
/Søren
Avatar billede erikjacobsen Ekspert
30. juli 2010 - 12:37 #3
Du er nødt til at vide hvilket tegnsæt du putter data i - det afhænger ikke af indstillingerne i tabellen, men af indstillinger på dine websider.

Når du viser æøå på en webside, bliver der også valgt et tegnsæt.

Jeg tror du bruger ISO-8859-1 på dine sider, og http://php.net/json_encode virker kun på UTF-8
Avatar billede erikjacobsen Ekspert
30. juli 2010 - 12:42 #4
Et hack, som jeg ikke synes så godt om, vil være at kode om til UTF-8, når du henter data: http://php.net/utf8_encode

Det er selvfølgelig bedre at have styr på tegnsæt ;)
Avatar billede sprimdal Nybegynder
30. juli 2010 - 13:00 #5
Du har ret når jeg skifter om til utf-8 så kan jeg godt at tegnere er underligt...  men jer er stadig ikke helt med på hvordan dette løses....
Avatar billede erikjacobsen Ekspert
30. juli 2010 - 13:23 #6
Man kan ikke lave websider i dag uden at have styr på tegnsæt. Derfor spørger jeg om hvilket tegnsæt du bruger - tilsyneladende har du brugt ISO-8859-1 - hvilket kan være ok, selv om UTF-8 oftere er et bedre valg.

Så du må vælge om du vil lave alt om til UTF-8 - eller køre videre med det lille hack. Eller bruge en anden metode til at lave en JSON encoding.
Avatar billede sprimdal Nybegynder
30. juli 2010 - 13:41 #7
Helt enig, jeg tror også at det her her problemer ligger, det lyder som en god ide at definere det hele som UFT-8. ( Noget som jeg ikke har været obs på før. )

Jeg ved ikke om det har nogen betydning... men php koden oven for er den eneste kode der er på hele hjemmesiden. Da det skal bruges som et http request.

Vil det sige at jeg skal konvertere de strenge jeg henter til uft-8 inden jeg encoder den til json ..... ?
Avatar billede erikjacobsen Ekspert
30. juli 2010 - 13:49 #8
Hvis du sender JSON kode ud, bør du have en contenttype, der siger det: application/json
Avatar billede sprimdal Nybegynder
30. juli 2010 - 14:09 #9
he he ... jeg er vist kommet ud hvor ikke plejer at befinde mig.... så med fare for at blive til grin kommer hvad jeg ville tro kunne fungere. ( kompletkode )

<?php
include 'config.php';
include 'opendb.php';

header('Content-type: application/json');

$result = mysql_query("SELECT * FROM Json  ");
while($row = mysql_fetch_array($result)){
    $arr[] =  array('id'=>$row[Navn]);        

echo $row[Navn]; // kun til fejlsøgning
}


echo json_encode($arr);

mysql_close()
?>

output :

S&#65533;ren PrimdalJan S&#65533;eHelle Skov PrimdalHenrik S&#65533;rnsenS&#65533;ren KirkegaardSvend LarsenKatja KLars Christiansen&#65533;ge[{"id":null},{"id":null},{"id":"Helle Skov Primdal"},{"id":null},{"id":null},{"id":"Svend Larsen"},{"id":"Katja K"},{"id":"Lars Christiansen"},{"id":null}]


Så jeg har tydeligt vis ikke ramt det rigtigt. Jeg er med på at det er problemer med tegnsættet... men jeg kan sku ikke helt se hvor jeg retter det.

/Søren
Avatar billede sprimdal Nybegynder
30. juli 2010 - 15:03 #10
Lige en lille opdatering. jeg tilføjede denne linie lige efter mit connect til databasen : mysql_query('set NAMES utf8');

Så bliver mit output således :

[{"id":"S\u00f8ren Primdal"},{"id":"Jan S\u00f8e"},{"id":"Helle Skov Primdal"},{"id":"Henrik S\u00f8rnsen"},{"id":"S\u00f8ren Kirkegaard"},{"id":"Svend Larsen"},{"id":"Katja K"},{"id":"Lars Christiansen"},{"id":"\u00e5ge"},{"id":"s\u00f8ren S\u00f8rnsen"}]
Avatar billede erikjacobsen Ekspert
31. juli 2010 - 20:35 #11
Det ser jo rigtig nok ud - måske kan du leve med det, selv om du ikke bruger UTF-8 hele vejen igennem....?
Avatar billede sprimdal Nybegynder
04. oktober 2010 - 08:52 #12
Lige en lille opdatering. jeg tilføjede denne linie lige efter mit connect til databasen : mysql_query('set NAMES utf8');

Så bliver mit output således :

[{"id":"S\u00f8ren Primdal"},{"id":"Jan S\u00f8e"},{"id":"Helle Skov Primdal"},{"id":"Henrik S\u00f8rnsen"},{"id":"S\u00f8ren Kirkegaard"},{"id":"Svend Larsen"},{"id":"Katja K"},{"id":"Lars Christiansen"},{"id":"\u00e5ge"},{"id":"s\u00f8ren S\u00f8rnsen"}]


Dette virkede :)
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
Kurser inden for grundlæggende programmering

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



IT-JOB

Hiper A/S

IT-systemudvikler

Cognizant Technology Solutions Denmark ApS

Senior Test Manager

Sentia Denmark A/S

Service Delivery Manager

Metro Service A/S

Risk & Cyber Security Expert

MAN Energy Solutions

Department Manager Edge Platform