Sivuston merkistökoodaus on UTF-8. Ääkköset näkyvät sivustolla muuten oikein, mutta vieraskirjassa ne muuttuvat muotoon ääkköset=ääkköset
Yritin tuloksetta siivota ääkköset seuraavalla funktiolla:
function Siivoa($teksti) { $teksti = str_replace('ä', 'ä', $teksti); }
Olisikohan kenelläkään parempia ideoita ääkkösten siivoamiseksi?
vaihda utf-8 näin
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
voi auttaa..
Ai vaihtaisin sivuston merkistökoodaukseksi iso-8859-1, vaikka haluan sen olevan UTF-8?
Mä oon kuullu semmosesta ku utf-8 tuplakoodaus, eli siis tuos käyny niin että Ã-merkki on tallennettu utf-kasina...
edit: Phpees ei oo ilmaisesti kunnon utf-8 tukea.
Kyllä nyt pitää saada tietää enemmän siitä, mistä vieraskirjasta on kysymys tai saada nähdä enemmän sen vieraskirjan sorsaa.
Jos haluaa että fontit toimii kunnolla niin Apache conf, php.ini, mysql ym.ym
pitää kaikki olla utf-8, iso-8859-1, tai 1252. utf-8 on tehnyt tuloaan kymmenen
vuotta, mutta on edelleen puutteellinen. Jos haluaa testailla ja kokeilla erilaisia juttuja niin iso-8859-1 on hyvä. Tietysti unix käyttäjille utf-8.
Yleensäkin unicode tuki on hieman huono PHP:ssa ennen uutta versiota (6.0.0) jossa se on natiivina.
Jos vieraskirja on oma tekele, niin PHP:ssa on htmlspecialchar funktio jolla tuota hommaa voi hoitaa JATKOSSA. Se, että miten nykyiset merkit voi muuntaa muuksi, niin se onkin hyvä kysymys. Ongelma voi piileä tietokannassa, PHP:ssa tai itse tiedostoissa joissa sorsa on. Näkemättä tuskin kukaan voi hirveämmin auttaa, arvailla toki voi...
-W-
peg puhuu hieman kökkäreitä, UTF-8 toimii vallan mainiosti eikä se ole millään tavoin puutteellinen tai tuloillaan enää. Enemmän ongelmia on siinä ettei osata seurata syy-seuraus -suhteita merkistöjen kanssa toimiessa.
Jos lähdetään puhtaalta pöydältä ja tehdään uusi sivusto UTF-8:lla, niin sen tekeminen ei poikkea mitenkään siitä, että tehdään sivusto ISO-8859-1:llä. UTF-8:aa ei tarvitse ottaa huomioon mitenkään erityisellä tavalla. Lätkii vaan sivuille oikean asetuksen niihin kohtiin joihin charset pitää syöttää ja myös tallentaa sivut UTF-8:lla (ilman byte order markia, mitä jotkut ohjelmat oletuksena yrittävät tunkea). Niinhän sitä on myös ISO-8859-1 -sivujen kanssa tehty (joskin niistä ei voi löytyä byte order markia).
Tietokantakin voi sanoa että se on jotain muuta, koska niiden merkistöasetus vaikuttaa vain siihen, missä aakkosjärjestyksessä kutsujen tulokset tulevat kun niitä pyydetään aakkosjärjestyksessä.
Selkeää ja yksinkertaista.
Muiden koodi on asia erikseen. Kun sivuja lähtee tekemään, niin kannattaa tavalla tai toisella varmistaa, että käytettäviä softia tehdessä on otettu UTF-8 huomioon. Esim. phpBB2, jos sitä joku haluaa käyttää, ei ole suunniteltu UTF-8:aa varten, joten se pitää joko itse puukottaa siihen (mikä tosin on pääosin helppoa) tai valita softa joka toimii UTF-8:na (esim. phpBB3). Monet softat on kuitenkin nykyään oletuksena UTF-8:lla toimivia, WordPresseistä ja MediaWikeistä lähtien. Niitä ei itseasiassa edes voi käyttää muilla merkistöillä ilman valtavaa purkkaamista.
Mitä tulee PHP:n merkistötukeen, niin PHP käsittelee merkkijonoja aina 8-bittisinä. Eli sillä ei saa täysiä merkkejä napsittua vaikkapa UTF-8:n kanssa, tosin joistakin funktioista löytyy mbstringin kautta laajennus. Ongelma mbstringissä on, ettei se ole aina asennettuna PHP:n mukana. Joten, sitä PHP6:tta odotellessa joutuu hieman miettimään miten merkkejä käsittelee. Toivottavasti tulee tuki merkistöjen käyttöön UTF-16 -muodossa sisäisesti ja sitten helppo tapa puskea ulos ihan mitä tahansa merkistöä. Tässä lisäinfoa nykyisyydestä.
<?php function Siivoa($teksti) { $teksti = stripslashes($teksti); $teksti = htmlentities($teksti); $teksti = str_replace("\r\n", '<br />', $teksti); $teksti = str_replace("\n", '<br />', $teksti); $teksti = str_replace(' ', ' ', $teksti); $teksti = str_replace('|', '|', $teksti); return $teksti; } $tiedosto = 'vieraskirja.txt'; if (!file_exists($tiedosto)) @touch($tiedosto, 0775); if (!file_exists($tiedosto)) { echo 'Vieraskirjatiedosto on luotava ennen kuin vieraskirjaa voi käyttää ja sille annettava chmod 775 oikeudet!'; exit; } if (isset($_POST['viesti'])) { if ($_POST['nimi'] == '') { $_POST['nimi'] = 'Anonyymi'; } $fp = @fopen($tiedosto, 'r+'); @flock($fp, 2); $uusi_viesti = Siivoa($_POST['nimi']) . '|' . date('d-m-Y') . '|' . Siivoa($_POST['viesti']) . "\n"; $vanhat_viestit = @fread($fp, filesize($tiedosto)); @rewind($fp); if (trim($vanhat_viestit == '')) $sisalto = trim($uusi_viesti); else $sisalto = $uusi_viesti . $vanhat_viestit; @fwrite($fp, $sisalto); @flock($fp, 3); @fclose($fp) or die('Ei kirjoitusoikeuksia, anna chmod 775 oikeudet vieraskirjatiedostoon.'); } else //ei uutta viestiä { //haetaan vieraskirjan sisältö tiedostosta $fp = fopen($tiedosto, 'r'); flock($fp, 1); $sisalto = fread($fp, filesize($tiedosto)); flock($fp, 3); fclose($fp); } //Linkit viesteihin $sisalto = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\">\\0</a>", $sisalto); ?>
<h1>Vieraskirja</h1> <p>Kirjoita vieraskirjaan</p> <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post"> <p>Nimi<br /> <input name="nimi" size="35" /></p> <p>Viesti<br /> <textarea name="viesti" rows="5" cols="35"></textarea></p> <p> <input type="submit" value="Lähetä" /> </p> </form> <?php //jaetaan sisältö riveittäin muuttujaan viestit $viestit = explode("\n", $sisalto); //määritetään katsottavat viestit if (!isset($_GET['persivu'])) $_GET['persivu'] = 10; if (!isset($_GET['sivu'])) $_GET['sivu'] = 1; $loppu = $_GET['persivu'] * $_GET['sivu']; $alku = $loppu - $_GET['persivu'] + 1; $viestit_maara = count($viestit); $sivut_maara = floor(($viestit_maara - 1) / $_GET['persivu']) + 1; if ($loppu > count($viestit)) $loppu = count($viestit); if (trim($sisalto == '')) $loppu = 0; //tulostetaan katsottavat viestit väliltä $alku...$loppu for ($viesti = $alku - 1; $viesti <= $loppu - 1; $viesti++) { $viestit[$viesti] = explode('|', $viestit[$viesti]); echo ' <blockquote><p><b>' . $viestit[$viesti][0] . '</b> kirjoitti <span>' . $viestit[$viesti][1] . '</span></p> <p> ' . $viestit[$viesti][2] . '</p></blockquote> '; echo "\n"; } echo "<p>"; for ($i = 1; $i <= $sivut_maara; $i++) if ($i != $_GET['sivu']) echo ' <a href="' . $_SERVER['PHP_SELF'] . '?sivu=' . $i . '">' . $i . '</a> '; else echo '<span>'. $i . '</span>'; ?> </p>
Ääkköset näkyi aikaisemmin oikein, kun merkistökoodaus oli vielä ISO-8859-1. Pariin kertaan olen tarkastanut, että jokainen tiedosto on tallennettu varmasti UTF-8:na. Ääkköset näkyvät vain silloin oikein, jos käyn viestin lähettämisen jälkeen manuaalisesti korjaamassa ne oikeiksi. Mielestäni se kielii siitä, että jotain menee viestin lähettämisessä tai tallentamisessa pieleen.
Kokeile muuttaa rivi
$teksti = htmlentities($teksti);
muotoon
$teksti = htmlentities($teksti,ENT_COMPAT,"UTF-8");
Mikä tiedosto on tallennettu UTF-8:na? Ovatko kaikki tiedostot varmasti UTF-8:na? Tarkoittaen, että:
1) PHP-tiedostot ovat UTF-8:na (editorista tallentaen)
2) PHP-tiedostojen tulostama HTML on UTF-8:na (ja niissä on UTF-8 metatagi)
3) kohdan 1 ja 2 ollessa totta pitäisi myös tekstitiedostojen uusien tallennuksien olla UTF-8
Merri kirjoitti:
Mikä tiedosto on tallennettu UTF-8:na? Ovatko kaikki tiedostot varmasti UTF-8:na? Tarkoittaen, että:
1) PHP-tiedostot ovat UTF-8:na (editorista tallentaen)
2) PHP-tiedostojen tulostama HTML on UTF-8:na (ja niissä on UTF-8 metatagi)
3) kohdan 1 ja 2 ollessa totta pitäisi myös tekstitiedostojen uusien tallennuksien olla UTF-8
1) PHP-tiedostot ovat editorista tallennettu UTF-8:na.
2) UTF-8 löytyy metatagista.
3) Tekstitiedosto on myös tallennettu UTF-8:na.
Kokeilen tuota Contrabandin vinkkiä ja katson josko se toimisi.
Contraband kirjoitti:
Kokeile muuttaa rivi
$teksti = htmlentities($teksti);muotoon
$teksti = htmlentities($teksti,ENT_COMPAT,"UTF-8");
Kiitos Contraband, neuvosi avulla ääkköset näkyvät oikein.
Hmm, tosiaan, olen itse aina käyttänyt htmlspecialcharsia htmlentitiesin sijaan. Oikeastaan htmlentities on htmlspecialcharsin ylivedetty muoto, se kun muuntaa entityiksi kaiken mahdollisen toisin kuin htmlspecialchars, joka muuntaa vain kaiken oleellisen.
Lopullisen HTML:n koodiin katsominen muuten olisi paljastanut tämän helposti ja nopeasti :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.