Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Ääkköset vieraskirjassa

Sivun loppuun

OskariB [18.02.2008 20:54:55]

#

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?

peg [18.02.2008 21:28:21]

#

vaihda utf-8 näin
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
voi auttaa..

OskariB [18.02.2008 21:38:09]

#

Ai vaihtaisin sivuston merkistökoodaukseksi iso-8859-1, vaikka haluan sen olevan UTF-8?

Dude [18.02.2008 22:04:14]

#

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.

Merri [18.02.2008 23:07:39]

#

Kyllä nyt pitää saada tietää enemmän siitä, mistä vieraskirjasta on kysymys tai saada nähdä enemmän sen vieraskirjan sorsaa.

peg [19.02.2008 00:25:26]

#

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.

Wizard [19.02.2008 07:02:58]

#

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-

Merri [19.02.2008 11:40:20]

#

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ä.

OskariB [19.02.2008 21:14:28]

#

<?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('  ', '&nbsp;&nbsp;', $teksti);
      $teksti = str_replace('|', '&#124;', $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.

Contraband [19.02.2008 22:22:17]

#

Kokeile muuttaa rivi

$teksti = htmlentities($teksti);

muotoon

$teksti = htmlentities($teksti,ENT_COMPAT,"UTF-8");

Merri [19.02.2008 22:39:26]

#

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

OskariB [20.02.2008 09:20:03]

#

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.

OskariB [20.02.2008 14:26:57]

#

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.

Merri [20.02.2008 15:07:48]

#

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 :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta