Moi,
En ole pitkään aikaan php:tä tai mysql-tietokantaa käpistellyt, joten kysyn neuvoa miten palveluntarjoajan webhotelli päivityksen yhteydessä esiin nousseen ongelman saisi turvallisesti korjattua.
Tausta:
- Rakennettu joskus vuonna 2010
- En ymmärtänyt silloin paljoa merkistöjen päälle
- Käytössä edelleen, mutta uusi versio onneksi tekeillä
Ongelma:
- Palveluntarjoaja (louhi) päivitti php-version (ja mahdollisesti muutakin) ja ääkköset eivät enää näy oikein
Tilanne:
- Varmuuskopiot otettu tänään
- Tietokanta on kokonaisuudessaan latin1_swedish_ci
- Palvelin vastaa headerilla Content-Type: text/html; charset=UTF-8
- Tiedostojen tallennusformaatti on selvityksessä, ftp tunnukset vielä lukossa.
-- Content manageri näyttää tiedostoilla muotoa PHP script, ISO-8859 text
- HTML puolella ei ole määritelty mitään merkistöön liittyvää. Sisältö alkaa seuraavasti
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" lang="fi">
Mitkä olisivat semmoset peliliikkeet, joilla vanhan sivuston saisi tekohengitettyä turvallisesti kuntoon?
Ja lisäys,
Sivusto aikanaan tehty putkan php-opasta apuna käyttäen - en muista miten siellä oli asiat neuvottu enkä voi taata olenko niitä silloin kuinka tarkasti edes noudattanut. Kiitos avuista!
Lisäys 2, lisätty info content managerin tiedostomuodosta.
Korjaustoimenpiteet on luultavasti melko triviaalit: Katsot mitä merkistöä sivusto oikeasti puskee ulos (oletettavasti muu kuin Content-Type headerissa mainittu UTF-8) ja sitten lisäät php-sivut lähettämään headerin ko. merkistöllä.
Eli esim. jos merkistö olisi ISO-8859-1 niin
header('Content-type: text/html; charset=iso-8859-1');
Eli oletettavasti et ole tuota tehdessä laittanut mitään merkistömääritettä ja nyt Louhi on päivittänyt järjestelmään oletusheaderiksi tuon mainitsemasi, jolloin sivun sisältö ei enää vastaa sitä mitä se kertoo olevansa. Mahdollisesti voit myös omalle sivustolle muuttaa tuon oletusheaderin, jolloin ei tarvitse kaikkia PHP-koodeja muuttaa.
Kiitos Grez, kokeilen tuota.
Edit,
Noh, täytyy odottaa että saan ftp tunnukset auki. En tuon content managerin kautta viitsi alkaa editoimaan.
Pikateippinä kuitenkin löysin vaihtoehdon vaihtaa oletus php-version takaisin siihen mikä se oli ennen päivitystä joten sivut toimii taas. Täytyy kuitenkin tällä viikolla laittaa myös nuo merkistöt kuntoon ja päivittää versio takaisin.
Lisäys,
Nyt kun katson palvelimelta tulevia headereita niin charset puuttuu kokonaan. Eli tulee vain Content-Type text/html. Täytyy etsiä mikä oletus on tässä tilanteessa niin ratkeaa varmaan sillä!
Otetaanpa oppaasta mallia:
https://www.ohjelmointiputka.net/oppaat/opas.
Nettisivuston toteutuksessa on tärkeää, että merkistökoodaus on valittu kaikkialla johdonmukaisesti samaksi. Käytännössä:
Kaikkien tiedostojen koodaus on oikea. Tiedoston koodauksen pystyy valitsemaan useimmissa tekstieditoreissa tiedoston tallennuksen yhteydessä. UTF-8-enkoodausta käytettäessä pitää huolehtia, että tiedoston alussa ei ole BOM-merkkiä (byte order mark).
Palvelin ilmoittaa nettiselaimelle oikean koodauksen. Tämän voi tarvittaessa varmistaa PHP:n
header
-funktiolla seuraavasti tiedoston alussa:header("Content-Type: text/html; charset=X");Tässä kohtaan X tulee ISO-8859-1 tai UTF-8 riippuen koodauksesta.
HTML-koodin head-osiossa ilmoitettu koodaus on oikea:
<meta charset="X" />Tässä kohtaan X tulee ISO-8859-1 tai UTF-8 riippuen koodauksesta.
Jos käytössä on tietokanta, myös sen asetuksissa koodaus on oikea. MySQL-tietokantayhteyden merkistön voi asettaa esimerkiksi seuraavalla kyselyllä heti yhdistämisen jälkeen:
SET NAMES XTässä kohtaan X tulee latin1 tai utf8 riippuen koodauksesta.
Kun nämä kohdat ovat kunnossa, merkistöt toimivat oikein. Tietokannan sisäinen merkistö (kuten latin1_swedish_ci) ei vaikuta tähän toimivuuteen mutta vaikuttaa kyllä siihen, mitä merkkejä kantaan voi tallentaa ja miten tekstit aakkostetaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.