Tämä on varmaankin melko tavallinen ja kysytty ongelma, mutten silti ole löytänyt toimivaa vastausta/ratkaisua. Saan tietokannasta haettujen tekstien ääkköset kyllä näkymään sivuilla oikein, mutta ongelma tulee niiden järjestämisessä aakkosjärjestykseen. Olisi tärkeää saada henkilöt järjestettyä aakkosjärjestykseen, mutta kaikilla kokeiluillani ä tulee ennen tai heti jälkeen a:n eikä z:n jälkeen niinkuin pitäisi. Merkistökoodauksesta en kylläkään tajua lähes mitään, joten vastaus pitäisi vääntää heti ensi yrittämällä rautalangasta. Millähän merkistöllä tietokanta osaisi järjestää ääkköset oikein?
Tällä hetkellä tietokanta on utf8_unicode_ci ja ääkköset näkyvät tietokannassa ä -merkkeinä. Eikö tietokanta osaa järjestää näitä merkkejä z:n jälkeen eli pitäisikö ääkkösten olla tietokannassakin ääkkösinä? Tietokannassa olevia ääkkösiä en kuitenkaan ole saanut sivuilla näkymään, joten mitä sen korjaamiseksi sitten täytyisi tehdä?
Yhteytesi ei ole UTF-8. Heti tietokantayhteyden muodostamisen jälkeen kutsu funktiota mysql_set_charset('utf8');
– vanhat tietokannassa jo olevat ääkköset tulevat näkymään nyt väärin, mutta tämän jälkeen tieto kulkee PHP:n ja MySQL:n välillä kokoajan UTF-8:na ilman ylimääräisiä muunnoksia. Oletuksena MySQL:n yhteys on latin1.
Lisäinfona aiemmin ei kutsuttu tuota funktiota, koska se on lisätty vasta PHP5:ssä. Sen sijaan tietokannalle lähetettiin komento mysql_query('SET NAMES utf8');
Laitoin tuon funktion heti tietokantayhteyden muodostamisen perään, muttei sillä näyttäisi olevan minkäänlaista vaikutusta. Ääkköset tulee edelleen tietokannasta a:n ja o:n veroisina. Eli äö käsitellään kuin ao.. Missähän minulla voisi vielä olla virheitä?
Eikö tähän ääkkösongelmaani löydy jotain ratkaisua? Itse olen näiden merkistöjen kanssa niin pihalla, ettei tästä omin tiedoin mitään tule. Onkohan ongelma siis siinä, että tietokannassa ä näkyy ä -merkkinä, jolloin se ei osaa sitä aakkostaa sinne z:n jälkeen? Miten sitten saisin tietokantaan äät äänä niin, että ne näkyvät sivuillakin äänä eikä � merkkeinä?
Enkö vastausta ole saanut sen takia, että olen jotain oleellista jättänyt ongelmasta kertomatta? Eli pitäisikö osata tästä vielä jotain infoa kertoa?
Edit: näköjään tuo merkki jollaisena äät näkyvät sivulla ei tässä näy, mutta tiedätte kyllä miltä se näyttää..
suosittelen ainakin tarkistamaan millaisessa muodossa kirjaimet siellä kannassa ovat, eli ottamaan vaikka mysql:n komentorivi-clientillä yhteyden ja katsomaan mitä sieltä löytyy. Jos sielläkin on korruptoituneita tai muuten outoja(ISO-8859-15) ääkkösiä niin ensin pitäisi tietenkin yrittää saada ne korjattua kunnon UTF-8:ksi. Sitten voi alkaa katsomaan sovelluksen koodia niin että se myös pysyy utf8:na koko matkan loppukäyttäjälle saakka, ja vastaavasti että loppukäyttäjältä tuleva data tarkistetaan ja muunnetaan tarvittaessa utf8:ksi. MySQLsta on minulla vähemmän kokemuksiaa joten neuvot jäivät vähän yleisluontoiseksi nyt. Mutta periaatteena kuitenkin että jos kaikki on kaikkialla UTF-8ia niin on ehkä joku toivo että toimisikin.
phpMyAdminin avulla MySQL:ää käytän. Sieltä olen kyllä katsonut, että jokaisen sarakkeen aakkosjärjestykseksi on laitettu utf8_unicode_ci, taulun aakkosjärjestykseksi on laitettu utf8_unicode_ci ja myös koko tietokannan aakkosjärjestykseksi on laitettu utf8_unicode_ci. Enpä ole löytänyt muita paikkoja joista noita merkistöjä voisin säädellä.
Kun lisään tekemälläni lomakkeella sivujen kautta tietoja tauluun niin ääkköset tulevat sinne ä -merkkeinä ja näkyvät sivuilla ihan oikein ääkkösinä. Mikähän tässä voisi väärin mennä niin, ettei aakkostus toimi ääkkösten osalta oikein?
AkeMake kirjoitti:
Kun lisään tekemälläni lomakkeella sivujen kautta tietoja tauluun niin ääkköset tulevat sinne ä -merkkeinä ja näkyvät sivuilla ihan oikein ääkkösinä.
Tuo viittaa siihen, että tietokantayhteyden merkistö on edelleen väärä. Millaisella koodilla yhdistät kantaan ja asetat merkistön?
try { $lnk = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_DB, DB_USER, DB_PASSWD); mysql_set_charset('utf8', $lnk); } catch (PDOException $e) { die("VIRHE: " . $e->getMessage()); } $lnk->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Mikähän tuossa menee väärin?
PHP.net:stä löysin PDO:lle kommentin jossa annettiin komento $lnk->exec('SET CHARACTER SET utf8') jolla lähti itselläni toimimaan.
Jos palvelimellasi olisivat virheilmoitukset käytössä, saisit varmaan tuosta varoituksen, että mysql_set_charset-funktiolle ei voi antaa PDO-objektia.
Laitoin mysql_set_charset:n tilalle tuon Othnos:n antaman komennon ja sillä ääkköset tallentuivat tietokantaan oikein ääkkösinä ja sivuille tietokannasta haetut ääkköset näkyivät väärin, niin kuin kuuluikin.. Ongelmana näyttäisi vain silti olevan tuo sama, että vaikka ääkköset tallentuvatkin nyt tietokantaan ääkkösinä niin utf8_unicode_ci aakkosjärjestyksellä ääkköset eivät silti järjesty oikein vaan aakkostuvat ä aana ja ö oona.. Mistähän vielä kiikastaa?
Käyttämässäni MAMP:ssa ei nuo virheilmoitukset ole näköjään käytössä, mutta kun siirsin sivut nettiin niin siellä sain virheilmoitusta siitä mysql_set_charset-funktiosta. En vain osannut ihan täysin suomentaa, että mitä se virhe tarkoitti.. Pitääpä ottaa käyttöön tuolla MAMPinkin puolella nuo virheilmoitukset..
Edit: Sainkin aakkostuksen toimimaan ääkköstenkin osalta, kun laitoin aakkostusperusteeksi utf8_swedish_ci eli ongelma on näinollen ratkaistu. Kiitos avusta!
Aihe on jo aika vanha, joten et voi enää vastata siihen.