Kirjoitin erään php -dokumentin tekstikenttään erikoismerkin, vaikkapa neliöjuuren, jonka numerokoodi on #8730. Kun tallensin sitten tekstikentän tekstit MySQL -tietokantaan ja tulostin myöhemmin näkyviin, merkki näkyi oikein, MUTTA kun menin muokkaamaan tekstiä uudelleen samaisessa kentässä, merkki ei enää näkynytkään numerokoodina (#8730), vaan oli muuttunut neliöjuurimerkiksi. Siis merkki on vielä tietokannassa numerokoodina, mutta kun tieto tulostetaan tietokannasta tekstikenttään, koodi muuttuu sitä vastaavaksi merkiksi. Kun tallennan sen, merkki muuttuu kysymysmerkiksi!
Huhhuh, olipa hankalasti selitetty, toivottavasti ymmärsitte ongelman ytimen. Kaikki sivut ainakin ovat utf8, jos se vaikuttaa.
Olet varmaan unohtanut käyttää htmlspecialchars-funktiota, kun tulostat tekstin takaisin muokattavaksi. Käytä aina htmlspecialchars-funktiota, jos ei ole tarkoitus tulostaa toimivaa HTML-koodia!
Voit testata myös, mitä käy, jos kirjoitat tekstikenttään esimerkiksi näin: >'>"></textarea>moi
.
Tietokantasi ei selvästi ole UTF-8-muodossa, jos kerran neliöjuurimerkin tallentaminen ei onnistu. Siis voi olla, että tieto kyllä liikkuu UTF-8-muotoisena mutta MySQL-taulussa käytetään latin1-merkistöä ja erikoismerkit eivät siksi toimi. Voit tarkistaa asian lauseella SHOW CREATE TABLE taulu; loppupuolella kuuluu lukea DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci, ja yksittäisillä sarakkeilla ei pidä näkyä ristiriitaisia määreitä.
Aivan oikein, pirkules palautti latin1, kun kirjoitin tuon SQL-komennon, kiitos :) Htmlspecialchars -funktiota en haluaisi käyttää, koska silloin en pysty muotoilemaan tekstiä niin tehokaasti.
Mistä saan sen vaihdettua, tuon merkistökoodauksen? (kysyn varalta, kun en ole vielä asiaa ehtinyt tutkia)
Haraldinho kirjoitti:
Mistä saan sen vaihdettua, tuon merkistökoodauksen? (kysyn varalta, kun en ole vielä asiaa ehtinyt tutkia)
PhpMyAdminista on siihen toiminto, en tiedä onnistuuko sillä.
Muutin sen tietokannan koodauksen utf8:ksi, mutta se ei vaikuttanut. Vaihdoin sitten tuohon kohtaan, missä teksti tulostetaan tähän tekstikenttään, tämän htmlspecialchars() -funktion, jolloin sehän ei tietystikään vaikuta tekstin lopulliseen tulostukseen, vain siihen, mikä tulostetaan tekstikenttään. Nyt toimii!
Tietokannan oletusmerkistön muuttaminen ei muuta jo olemassaolevia tauluja. Muunnoksiin voit käyttää tällaisia kyselyitä:
ALTER TABLE taulu MODIFY sarake TEXT /* tms. tyyppi */ CHARACTER SET utf8; ALTER TABLE taulu CONVERT TO CHARACTER SET utf8;
Tämä muunnos ei tietenkään poista tarvetta htmlspecialchars-funktiolle, vaan sinulla vain oli nyt kaksi erillistä vikaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.