http://jjp.jouluserver.com/foorumi/pagetop.php
Tiedosto on UTF-8:na ja metatagikin ilmoittaa niin, mutta headereiden mukaan se on iso-8859-15 -muodossa. Miten saan korjattua? Pitäisi saada joko headereihin kirjoitettua, että se on UTF-8:aa tai sitten saada tiedosto iso-8859-15:ksi. En ymmärrä näistä yhtään mitään, joten joku voinee auttaa?
<?php header("Content-Type: text/html; charset=UTF-8");
Tuo BOM eli ylimääräiset tyhmät tavut tiedoston alussa pitäisi kuitenkin saada pois. Kannattaa käyttää jotain kunnollista tekstieditoria, joka ei laita niitä.
Entä jos kyseessä ei ole .php-tiedosto?
edit: Käytän Notepad++:aa, mutta en (yllätys yllätys) tajua siitäkään mitään.
Eikös tässä äskettäin sammakkomiehelle neuvottu htaccess-rivi siihen tarkoitukseen? Jos vaikka sinä onnistuisit käyttämään sitä paremmin.
Kiitoksia, olin unohtanut. Kokeilen.
Edit
Entäs nyt, kun äskeinen pätkä on lisätty include()-komennolla http://jjp.jouluserver.com/foorumi/topics.php <= tuon alkuun? Pistän pari koodia:
topics.php
<?php include("pagetop.php"); ?> <p class="plaintext"><?php echo $if_topictext; ?></p> <div id="topics"> <p> <h2><?php echo $if_topics; ?></h2> <table> <tr class='list0'><td><?php echo $if_topictitle; ?></td><td><?php echo $if_user; ?></td></tr><?php $yhteys = mysql_connect($dbhost,$dbuser,$dbpassword) or die($dbconnecterror); mysql_select_db($dbname, $yhteys) or die($dbnotfound); $user=1; $subject=$_POST['subject']; $topics=mysql_query("SELECT id, user, subject, time FROM topics"); for($i=0; $i < mysql_num_rows($topics); $i++) { $ls = ($i % 2)+1; $id = mysql_result($topics, $i, "id"); $subject = mysql_result($topics, $i, "subject"); $user = mysql_result($topics, $i, "user"); echo " <tr class='list$ls'><td><a href='topic.php?id=$id'>$subject</a></td><td><a href='profile.php'>$user</a></td></tr>\r\n"; } mysql_close($yhteys); ?> </table> </div> </p><p> <div id="functions"><form action="newtopic.php" method="post"> <h2><?php echo $if_newtopic; ?></h2><?php echo $if_topictitle; ?>: <input type="text" name="subject" size="50"><br><?php echo $if_message; ?>:<br><textarea name="message" rows="15" cols="100"></textarea><br><input type="submit" value="<?php echo $if_newtopic; ?>"></form> </div> </p> <?php include("pagebottom.php"); ?>
pagetopplain.php
<?php header("Content-Type: text/html; charset=UTF-8"); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Language" content="fi"> <title><?php echo $if_topics; ?> - <?php echo $if_sitename; ?></title> <link rel="stylesheet" href="style.php"> <link rel="stylesheet" href="style2.php"> </head> <body> <div id="everything"><div id="title"><h1><?php echo $if_sitename; ?></h1><div id="user"><h2><?php echo $if_user; ?></h2><ul><li>åöäöäöåöäöåö<?php if(!($userid=="")) { $yhteys = mysql_connect($dbhost,$dbuser,$dbpassword) or die($dbconnecterror); mysql_select_db($dbname, $yhteys) or die($dbnotfound); $kysely=mysql_query("SELECT username FROM users WHERE userid=$userid", $yhteys); $username=mysql_result($kysely,0,"username"); echo "<span class='logged'>$username:</span></li><li><a href='profile.php?id=$userid'>$if_profile</a></li><li><a href='logout.php'>$if_logout</a>"; } else { echo "<a href='login.php'>Kirjaudu sisään</a>"; } ?></li></ul></div></div> <div id="content">
pagetop.php
topinclude.php
ei tulosta mitään, ainoastaan asettaa muuttujia, jotka näkyvät koodissa.
UTF-8-ääkköset näkyvät aivan oikein. Sivun alareunassa on näköjään ISO-8859-1-ääkkösiä, jotka näkyvät nyt väärin (asdf����AAAGaaa). Oliko muuta kysyttävää?
Älä tapa sivun muodostusta kesken die-komennolla, vaan tulosta joku käyttäjälle oleellinen virheviesti (käyttäjän tuskin tarvitsee tietää tietokantavirheistä, vai muodostetaanko $db-alkuiset virheviestit sovelluksen hetkellisen ympäristön mukaan?).
Metabolix kirjoitti:
UTF-8-ääkköset näkyvät aivan oikein. Sivun alareunassa on näköjään ISO-8859-1-ääkkösiä, jotka näkyvät nyt väärin (asdf����AAAGaaa). Oliko muuta kysyttävää?
Alareunan koodi on tiedostossa pagebottom.php, joka lähetetään ISO-8859-1:nä. Mutta jos yritän lisätä siihen PHP:n avulla headereita, tulee ilmoitus "Warning: Cannot modify header information - headers already sent by (output started at /home/jjp/www/foorumi/pagetopplain.php:6) in /home/jjp/www/foorumi/pagebottom.php on line 1".
Minulla on .htaccess-tiedostossa rivit:
AddCharset UTF-8 .php AddCharset UTF-8 .html
...joten minkä takia se ei toimi oikein? pagetopplain.php
on ainoa, joka sisältää headerin content-type -määrittelyn.
tsuriga kirjoitti:
Älä tapa sivun muodostusta kesken die-komennolla, vaan tulosta joku käyttäjälle oleellinen virheviesti (käyttäjän tuskin tarvitsee tietää tietokantavirheistä, vai muodostetaanko $db-alkuiset virheviestit sovelluksen hetkellisen ympäristön mukaan?).
Käytän niitä lähinnä ohjelmiston ollessa kehitysvaiheessa. Ne sisältävät tällä hetkellä tekstit "Database error: Database not found" tai "Database error: Connection failed". Ne on asetettu tiedostossa topinclude.php, joka alustaa kaikki tarvittavat muuttujat (käyttöliittymätekstit, userid, tietokannan nimi, tunnus, salasana, tms.)
Juhko kirjoitti:
Alareunan koodi on tiedostossa pagebottom.php, joka lähetetään ISO-8859-1:nä. Mutta jos yritän lisätä siihen PHP:n avulla headereita, tulee ilmoitus "Warning: Cannot modify header information - headers already sent by (output started at /home/jjp/www/foorumi/pagetopplain.php:6) in /home/jjp/www/foorumi/pagebottom.php on line 1".
Koodaus on sivulatauskohtainen. Jos koostat yhden sivun useammalla eri php-tiedostolla, tulosta niissä kaikissa samaa merkistöä käyttäen. Et voi lähettää headereita enää, kun olet jo aloittanut tulostuksen (sivun yläosan).
Nii-in, mutta miten voin muuttaa niiden merkistöä, kun en voi muuttaa headereita?
Tottakai voit muuttaa PHP-tiedostoon kohdistuvan sivupyynnön vastauksen headereita. Katso tämän ketjun toinen viesti. Eli sinun tapauksessasi siellä mainittu header-kutsu kuuluu ilmeisesti pagetopplain.php:n alkuun, ennen kuin mitään tulostetaan.
Jos laitat headeriin UTF-8-määrityksen, laita sama merkistö myös <head>-osan meta-tagiin. Samoin tulosta kaikki sivulle tuleva teksti UTF-8-muodossa, eli tallennat kooditiedoston UTF-8-muodossa editorista, ja jos otat tekstiä tietokannasta, siellä olevan datan olisi parasta olla UTF-8-muodossa.
Yhtenäisyys toimii parhaiten ja UTF-8 on paras valinta nykyään, jos ei ole erityistä syytä käyttää muuta.
Avaa pagebottom.php hyvällä tekstieditorilla ja tallenna uudestaan UTF-8-enkoodattuna. Ei sen kummempaa.
Juhko kirjoitti:
tsuriga kirjoitti:
Älä tapa sivun muodostusta kesken die-komennolla --
Käytän niitä lähinnä ohjelmiston ollessa kehitysvaiheessa. --
Metodi-/funktiokutsut, jotka heittävät virheen eivät tarvitse erillistä virheentulostusta, mikäli PHP on konfiguroitu järkevästi siten, että kehitysympäristössä virheet tulostetaan näkyviin ja tuotantoympäristössä virhelogiin. Jos kutsu itsessään ei heitä virhettä/poikkeusta, voit heittää poikkeuksen manuaalisesti. Jos (ja kun) haluat muotoilla tulostusta (tuotantoympäristössä käyttäjille informatiiviset virheviestit) tai sen sijaintia, voit määritellä oman poikkeuskäsittelijän:
<?php class Handler { public static function handleError($code, $message, $file, $line) { if (!error_reporting()) { return; } throw new ErrorException($message, 0, $code, $file, $line); } public static function handleException($exception) { try { $vis = ini_get('display_errors'); if ($vis && strtolower($vis) !== 'stderr') { printf('Exception thrown: %s', $exception->getMessage()); } } catch (Exception $e) { printf('%s thrown within the exception handler. Message: %s on line %d', get_class($e), $e->getMessage(), $e->getLine()); } } } set_error_handler(array('Handler', 'handleError')); set_exception_handler(array('Handler', 'handleException')); ?>
Tuo näyttää hienolta tuo yläosa (jos värit olisivat erit). Käytän sitä koodia mikä siinä nyt on ja kopion sen ilman CP (CopyPaste) menetelmää ja korjaan itse virheet. En itse osaa hyvin mutta jos vaikka pitää asiattomien kommenttien vuoksi pistämää Jotku jutut rek. käyttäjille niin en osaisi. Kerro jos et halua niin en laita. Menee aikasintaa klo 20:00 ku pääsen kotiin.
en tiedä hyötyykö tästä enää mitään mutta jos notepad++ käytät saat BOM pois kun menet:
Tiedostomuoto->Muuta koodaukseen UTF-8 (Ei BOM)
Kiitokset ohjeista, nyt taitaa toimia. Katson seuraavaksi tuon tsurigan jutun.
Edit: Mikähän idea tässä nyt oikein on?
Undefined index: userid
Katsot taulukosta jotain kohtaa mitä ei ole olemassa.
Hupsista, ei siitä pitänyt kysyä (korjasin joka tapauksessa), vaan tuosta date-jutusta. Käskee ilmoittamaan timezonen "turvallisuussyistä".
No ilmoita.
Siis, en tiedä miten saan käyttäjän timezonen selville PHP:llä.
Edit: Vai kannattaako se mieluummin tehdä niin, että asetuksissa määritetään aikavyöhyke? Kuten esim. Wikipediassa.
Ei tässä ole käyttäjän aikavyöhykkeestä kyse, vaan laita siihen esimerkiksi palvelimen aikavyöhyke. Jos jostain syystä haluat kohdella eri käyttäjiä eri tavalla, niin laita käyttäjän profiiliin, mutta yleensä yksi järkevä oletusvaihtoehto riittää.
Kiitos ohjeista. Laitoin "Europe/Helsinki".
AddCharset ei näköjään toimi JouluServerillä, mutta AddDefaultCharset UTF-8 asettaa toimivasti kaikille tekstityyppisille tiedostoille oletusmerkistön. Ihan näin jälkitietona. :)
Huomasin, ja olenkin jo laittanut.
niin saanko lainata tätä? Muutan värejä ja tekstiä niin ei tunnista helpolla. Mainitsen toki tekijän jos saan.
Siitä vain...
Kiitos
Aihe on jo aika vanha, joten et voi enää vastata siihen.