Olen tässä pari päivää tapellut ä-kirjaimen kanssa, jota olen yrittänyt saada sivun titleen, enkä oikein keksi, mikä on vikana. Eli käytän sivustollani index.php-pohjaa, johon sitten haetaan sisältö. Kyseisessä pohjassa title määräytyy siis sivun osoitteen mukaan.
Sivun alussa on seuraavanlainen koodi:
<?php header('Content-type: text/html; charset=utf-8'); $section = $_GET[section]; $page = $_GET[page]; $subpage = $_GET[subpage]; $subpagename = str_replace("_", " ", $subpage); $subpagename = str_replace("%C4", "ä", $subpagename); if (is_null($section)) { $section = "Home"; } ?>
Title määräytyy seuraavan mukaan (seuraava koodi on siis title-tagien sisällä)
Northern Seer - Official Site <?php if (is_null($section)) echo(""); else echo(" :: ".$section); if (is_null($page)) echo(""); else echo (" :: ".$page); if (is_null($subpage)) echo(""); else echo(" :: ".$subpagename); ?>
Ja sisältö includetaan sitten seuraavanlaisesti:
<?php if (!preg_match("/^[a-zA-Z0-9_]+$/", $section)) { exit("URL-Parameter you entered isn't correct!"); } if (file_exists("contentpages/".$section."#".$page."#".$subpage.".php")) { include("contentpages/".$section."#".$page."#".$subpage.".php"); } else { exit("URL you entered doesn't exist!"); } ?>
Kaikki näkyy ja toimii erittäin hienosti, paitsi sivu, jonka titlessä pitäisi olla ä. Kyseisen sivun suhteellinen osoite on "index.php?section=Band&page=Members&subpage=Okko_J%C4rvinen" ja haettavan tiedoston nimi on "Band#Members#Okko_Järvinen.php". Mutta silti titlessä näkyy ä:n paikalla vain pelkkä neliö. Missä ongelma?
Sivut ovat koodattuina UTF-8 (ilman BOMia) ja UNIX-muotoon. Ja olen php:n ja meta-tiedon lisäksi ilmoittanut myös .htaccess-tiedostossa sivujen olevan UTF-8 -koodattuja, joten selainten pitäisi ainakin käsittää se :D
Olen erittäin kiitollinen avusta.
ps. Subpagename-muuttuja osaa kyllä ottaa tiedostonimessä esiintyvän _ -merkin pois sivun titlestä, joten siltä osin kaiken pitäisi olla kunnossa.
EDIT: Sattui mieleen heräämään vielä kysymys tuosta-titlessä näkyvän tekstin määrittämisestä. Muokkasin koodia siis jonkunverran alkuperäisestä, ja epäilen tuon koodin järkevyyttä. Siis kyllähän tuo toimii, mutta nojoo... sen voisi kai kirjoittaa jotenkin helpommin/järkävämmin, kun nyt on jokaisen muuttujan kirjottaminen titleen määritetty erikseen.
Juttuhan on siinä, että URLissa oleva %C4 on PHP:n puolella jo valmiiksi dekoodattu kyseiseksi merkiksi (chr(0xc4)), joka on ISO-8859-1-merkistön iso Ä-kirjain. Korvaa siis str_replacella %C4:n sijaan chr(0xc4). Järkevämpi vaihtoehto tietenkin olisi käyttää iconv-funktiota täyteen UTF-8-muunnokseen, ja vielä paljon parempi olisi alusta asti saada linkkiin UTF-8:n tavuja vastaava versio %C3%84 (Ä) tai %C3%A4 (ä), jolloin mitään muunnosta ei tarvittaisi. Vielä yksi hyvä vaihtoehto mahtuu mukaan, nimittäin ääkkösten täyskielto ja pysyminen 7-bittisessä ASCII-merkistössä (nimissä ja osoitteissa, ei tietenkään sisällössä).
Hmmmh, kokeilin heittää sinne str_replaceen ja siis osoitteeseen myös (näin ymmärsin?) %C4:n tilalle chr(0xc4) ja kyllähän se toimi, kiitoksia =)
Linkistä tulee nyt siis tämän näköinen: "index.php?section=Band&page=Members&subpage=Okko_Jchr%280xc4%29rvinen". Näinhän sen pitikin mennä, eikö vain?
Jäi kuitenkin nuo järkevämmiksi sanomasi vaihtoehdot mietityttämään. Noita ä:n url-merkkejä olen koittanut heittää jo linkeiksi, mutta en ole jostain syystä onnistunut, joten hylkäsin idean niiden käyttämisestä. Mutta tuo iconv-funktio jäi hämäämään, Mitä se siis oikein tekee?
Yhdyn Metabolixiin -
Metabpolix kirjoitti:
ääkkösten täyskielto ja pysyminen 7-bittisessä ASCII-merkistössä (nimissä ja osoitteissa, ei tietenkään sisällössä).
Ulkolaisilla näppiksillä käyttäjä ei välttämättä edes tiedä miten Ä tai Ö
saadaan osoiteriville.
Tediarp kirjoitti:
Näinhän sen pitikin mennä, eikö vain?
Ei alkuunkaan. Olisit voinut tässä soveltaa itsenäistä tiedonhankintaa.
urldecode("%C4") == chr(0xc4), eli osoitteen "J%C4rvinen" on PHP:ssä "J".chr(0xc4)."rvinen", ja oikea korvaus on str_replace(chr(0xc4), "ä", ...);
Kuten sanoin, tämä on vaihtoehdoista huonoin, varsinainen purkkaratkaisu.
Jahas, tajusin siis aivan väärin. Korjasin sen koodin oikein ja nyt pitäisi toimia. Voisin lueskella tuota php:n manuaalia, jotta selviäisi vähän enemmän php:n perusta. Tajuisinkin jotain asioista, joita käsittelen.
Mutta tyydyn tähän purkkaratkaisuun, koska kuitenkin koko sivustosta vain yksi sivu käsittää ä:n url:ssä. Sekin ä on vain eräässä nimessä, joka ei luultavasti esiinny muitten sivujen url:ssä/titlessä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.