Minulla on "hakurobotti", joka selaa nettisivuja ja tallentaa sisällön tietokantaan. Joillakin sivuilla toimii erinomaisesti (jos on UTF-8), mutta sitten muilla sivuilla tallentaa tietokantaan rikkinäisiä ääkkösiä mallia "ÃÂ" ja "ä".
Miten korjaan sen helposti?
Päätät ensin missä muodossa ne haluat tallentaa tietokantaan. Sitten tarkistat missä muodossa sivut ovat ja jos eri muodossa kuin tietokantasi niin muunnat ne oikeaan muotoon ennen tallentamista.
Helposti? No, en tiedä millä kielellä koodaat, mutta itse käyttämilläni työkaluilla tuo ei vaadi oikeastaan mitään. Tai siis, vaatii enemmän työtä että saa tallentumaan väärin.
Olennaista olisi tietää, miten olet määritellyt tietokantayhteyden merkistön ja miten käsittelet ladattuja nettisivuja.
Sanot, että UTF-8 toimii mutta muu ei. Oletko varma? Kaksimerkkinen "ä" viittaa siihen, että juuri UTF-8 olisi ongelma: UTF-8-koodattu "ä" näyttää Windows-1252-merkkeinä tulkittuna parilta "ä", ja edelleen UTF-8-koodattu "ä" näyttää Windows-1252-merkeiltä "ä". Jos ongelma olisi toisin päin, virhe näyttäisi toisenlaiselta.
Kieli on PHP, oma sivu on UTF-8 ja MySQL-tietokanta on säädetty noudattamaan merkistökoodausta UTF-8. Yhdellä sivulla millä testasin niin se sivu on iso-8859-1 ja ääkköset menee rikki.
EDIT: mb_convert_encoding korjasi.
Ääkköset eivät voi millään mennä tuohon suuntaan rikki, jos tallennettavan datan koodaus on ISO-8859-1 ja tietokannan UTF-8. Selvästi teet koodissasi jonkin muunnoksen.
Sinun pitäisi nyt joka tapauksessa tunnistaa datan koodaus ja muuttaa se oikeaksi. Tutut merkintäpaikat koodaukselle ovat HTTP-otsikko (Content-Type: text/html; charset=UTF-8), vastaava meta-tagi HTML-koodissa sekä nykyaikaisempi meta-tagin charset-attribuutti. Jos mitään ei löydy, koodaus on käytännössä Windows-1252. Voit muuttaa merkit iconv-funktiolla, tai jos ISO-8859-1 ja UTF-8-riittävät, voit käyttää funktiota utf8_encode.
Mulle tulee mieleen sellainenkin että sieltä kannasta tulisi ihan OK dataa mutta sitten palvelin ei antaisi mitään hdeaderia ja sivu tulostettaisiin sellaisenaan ulos ja siellä olisi code page metatagina Windows-1252.
No tää nyt on taas tällaista turhaa arvausta ongelmaan jonka saisi selvitettyä minuutissa jos olisi itse tekemässä.
Joo en mä tiedä mistä johtui tai ei ainakaan omasta koodistani, kun en tehnyt mitään muutoksia merkistönkoodaukseen omassa koodissani. Käytän PHP Simple HTML DOM Parseria sivun sisällön lataamiseen ja sieltä tuli sitten rikkinäistä ääkköstä, kun yritin tallentaa tietokantaan. Mutta korjaantui tosiaan mb_convert_encoding-funktiolla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.