Mistä johtuu, että ääkköse muutetaan �-merkkiseksi?
Alhaalla esimerkkilause:
Funktio file_get_contents lukee tiedoston koko sis�ll�n merkkijonoon. Funktiota voi k�ytt�� seuraavasti
Virhe saattaa johtua väärästä merkistökoodauksesta. Onko tuo teksti tiedostossa, nettisivulla vai missä?
tulostus tulee nettisivulle, kun ohjelma käynnistetään
Lue opas PHP:stä ja merkistöistä. Tallenna kaikki tiedostot UTF-8-muodossa ja ilmoita sivun otsikkotiedoissa oikea merkistö.
Kiitti. Nyt näyttää hyvältä -> "Funktio file_get_contents lukee tiedoston koko sisällön merkkijonoon. Funktiota voi käyttää seuraavasti".
Johtuu käytännössä siitä, että ISO-8859-1-koodattua (tai Windows Latin 1 -koodattua) merkkidataa yritetään tulkita UTF-8-koodatuksi. Ääkkösten ISO-8859-1-koodatut muodot ovat tavuja, joita ei voi esiintyä UTF-8-koodauksessa, joten ohjelmat esittävät ne käyttäen �-merkkiä (REPLACEMENT CHARACTER). Yleisesti se osoittaa, että datassa on virhe merkkien koodauksen tasolla.
Asiaa on selostettu hiukan tarkemmin jutussa ”Rikkinäisiä ääkkösiä jo 50 vuotta”, Skrolli 2015.1, s. 40–, http://skrolli.fi/2015.1.graffiti.pdf
Korjauksena on, että data tallennetaan sen koodauksen mukaisena, jonka mukaan sitä tullaan tulkitsemaan, mihin täällä on jo viitattu. Tämä voisi tapahtua joko niin, että HTTP-otsakkeissa ilmoitetaan koodaukseksi ISO-8859-1, jos merkit on esitetty sen mukaan. Järkevämpi vaihtoehto on nykyisin lähes aina se, että koodaukseksi vaihdetaan UTF-8 (ja tarkistetaan, että HTTP-otsakkeet ilmoittavat sen).
Yucca kirjoitti:
Johtuu käytännössä siitä, että ISO-8859-1-koodattua (tai Windows Latin 1 -koodattua) merkkidataa yritetään tulkita UTF-8-koodatuksi. Ääkkösten ISO-8859-1-koodatut muodot ovat tavuja, joita ei voi esiintyä UTF-8-koodauksessa
Taas väärin. Esimerkiksi ä on 0xE4 ISO-8859-1:ssä ja tuo tavu voi ihan hyvin esiintyä UTF-8-koodauksessa, vaikkapa jos koodattava merkki vaatii kolme tavua esityksekseen. Tällöin ensimmäinen tavu on välillä 0xE0-0xEF. Ja jos vaikka kirjoitan ISO-8859-1:llä ä&& tuo on ihan validia UTF-8:aakin ja tuottaa merkin 䣣.
Ilman sopivia jatkotavuja ei tuo tavu toki voi esiintyä, mutta voisi vähän tarkemmin sanoa.
Mikäli kyseessä HTML koodi pistä alkuun
Mikäli käytät UTF-8 pistä headiin
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
Jos käytät ISO-8859-1 (Yleensä notepadissa)
<meta http-equiv="content-type" content="text/html;charset=ISO-8859-1"/>
Markka kirjoitti:
Mikäli kyseessä HTML koodi pistä alkuun – –
Tämä on nykyaikaisempi tapa:
<meta charset="utf-8"/>
Sijoita se head
-osan ensimmäiseksi elementiksi, jolloin se vaikuttaa koko tiedostoon. (Esimerkiksi, jos ennen meta charset
-määritystä on title
-elementti, ei määritys vaikuta siihen, jolloin kyseisen elementin teksti näkyy väärin.)
Toinen vaihtoehto, jota voi käyttää myös edellä mainitun ohessa, on määrittää merkistökoodaus HTTP-otsikossa Content-Type
. PHP:ssä se onnistuu seuraavasti:
header('Content-Type: text/html; charset=utf-8');
(Merkkijonon utf-8
tilalle voi sijoittaa myös toisen merkistökoodauksen nimen, jos sellaista käyttää.
Aihe on jo aika vanha, joten et voi enää vastata siihen.