Fórumok
Sziasztok!
Hadd lássam már azt a nyomorult ☺-t egy Perl által generált dinamikus weboldalon! Segítsetek, legyetek szívesek.
#!/usr/bin/perl
my $ustring1 = "Hello \x{263A}!\n";
binmode DATA, ":utf8";
my $ustring2 = <DATA>;
binmode STDOUT, ":utf8";
print "$ustring1$ustring2";
__DATA__
Hello ☺!
STDOUT-on "Hello ☺!Hello ☺!" a kimenete.
A weblapon:
#!/usr/bin/perl
use CGI;
use CGI::Carp qw( fatalsToBrowser );
use CGI qw(:standard);
use DateTime;
use DB_File;
use DBM_Filter;
use Encode;
use utf8;
print header;
print start_html(-title=>'faszom',
-encoding=>'UTF-8',
-head=>[
meta({
-charset=> "UTF-8"
})]);
my $ustring1 = "Hello \x{263A}!\n";
binmode DATA, ":utf8";
my $ustring2 = <DATA>;
binmode STDOUT, ":utf8";
print "$ustring1$ustring2";
__DATA__
Hello ☺!
html kimenete: Hello ☺! Hello ☺!
Már egy rakás modult végigpróbáltam. Ennek a nyomai látszanak a use parancs után. UTF-8-as bejegyzésektől hemzseg a fejléc... Az a szmájli csak nem jelenik meg...
Hozzászólások
Teljesen logikatlan modon a http header felulbiralja azt az encodingot, amit a html kodba irsz. Szoval elobb nezz ra, hogy ott mit kuld ki a servered (curl pl.: curl --head http://example.hu/). Ha ott nem jo (valoszinuleg nem jo), akkor nezz ra, hogy a Perl hogy tud http headert allitani (gondolom a CGI modulban van ilyen kod).
Valami ilyesmire van szukseged:
Content-Type: text/html; charset=utf-8
--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin
Nagyon érdekes dolgot mondasz. A Perl legenerálja a
sort az
sor örömére. A curl pedig megerősítette a feltételezésedet.
A
sort módostítottam
-ra. A legenerált html forrásaban semmi nem változott, ellenben a charset valóban utf-8 lett. Itt jön a logikátlanság, ami írsz, némi döbbenettel párosulva.
Köszönöm a segítségedet. Más irányból nehezen jutottam volna ide.
Semmi gond, orulok, hogy segitett, amit irtam (perlhez amugy nem ertek). Igazabol a szabvany szar, mert a html forras jobban tudja, hogy o milyen encodingban van, mint a webserver, ami kiszolgalja. Szoval az utobbit kellett volna prioritassal kezelni.
Egyebkent nem ez az egyetlen hiba: a referrert is elirtak, a HTML nem XML (XHTML-tol eltavolodtak, pedig kijavithattak volna), a user-agent egy kaosz, meg tele van logikatlansagokkal az input mezok kornyeke.. csak igy fejbol par, ahhoz kepest, hogy utoljara 2008-ban foglalkoztam komolyabban webbel.
Ez az encoding egyebkent egy olyan dolog, amit ha egyszer megszivtal, legkozelebb mar tudni fogod. En is onnan tudom.
--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin
Eltekintve attól, hogy maga a HTTP 1.1 is szöveg alapú protokoll, szvsz pont az a nonszensz, hogy a szöveg kódolását magában a szövegben adod meg. Ahhoz, hogy a meta taget értelmezd, már eleve szükséges valamilyen kódolást feltételezni (ha nincs megadva a transzport protokollban, ahogy azt "illik", mármint kvázi kötelező). Emiatt néz ki úgy a HTML5 spec, ahogy
"Eltekintve attól, hogy maga a HTTP 1.1 is szöveg alapú protokoll,"
Nana! A kérés/válasz *fejléce* szöveg, nagyon jól meghatározott kódolási követelményekkel, de a *tartalom* már bináris (bajban is lennénk, ha fájl letöltés/feltöltés közben karakterkódolás miatt becsúszna egy pár hiba).
Jogos.
Pedig erre is oda kell figyelni, legalábbis Perlben. Hozzáteszem, azután, hogy a headert Nyosigomboc felvetése alapján rendbe tettem, a tartalmi kódolásos variánsok 2 perc alatt megvoltak, a fejléc egy fél napig sz*patott.
Fentebb valaki írta, hogy egyszer rendbe teszi, aztán nem felejti el. Nekem sikerült.
Pedig mind a HTTP, mind a HTML szabvány egyértelműen fogalmaz, nincs logikátlanság:
RFC 2616 (HTTP 1.1):
HTML5
Megkerdezlek, hogy hogy szolithatlak, erre azt mondod, hogy az nxu-t szereted.
Erre megkerdezem a melletted allo jarokelot, hogy szerinte hogy hivnak, akkor ha o elnevez mondjuk Belanak, akkor en Belanak foglak hivni. Ha a baratnodet kerdezem meg, akkor meg Mucuskamnak hivnalak, ha a kutyad, akkor meg vau-nak. Nincs itt semmi logikatlansag.
--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin
Mármint (ahogy feljebb is leírtam), megkérdezel angolul, hogy tudok-e angolul. Ha nem tudok, akkor erre milyen választ kéne adnom?
Szerencsére ez mind szépen le van írva a szabványban. A böngészők azt követik, tedd te is.
A http header megadja, hogy text/html, akkor jobb lenne, ha belenezne annak a text/html headerjebe a http header helyett, mert o jobban tudja. Objektumorientalt programozasnal is az egysegbe zaras a fo elv, emiatt kerdezed meg az adott objektumtol a sajat attributumat, mert o tudja a leginkabb. Plusz igy nincs inkonzisztencia.
Azert ha a headerben azt mondod nem tudsz angolul, ezutan elkezdesz akcentus nelkul angolul beszelni, fel fog tunni.
--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin
És a HTML-be hogyan nézünk bele, ha nem tudjuk, milyen kódolású? :)
Ja igen, a masik vicces dolog a BOM. Foleg PHP eseten. Mire a PHP-re atvaltana, a <?php elott ott a BOM (vagy igazabol barmi, whitespace pl.), emiatt mar elkuldi a http headert mire a PHP kod azt egyaltalan be tudna allitani. Raadasul pont UTF-8 eseten meg szukseg sem lenne ra.
--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin
A második scripted shellben futtatsd, és a teljes kimenetet idézd be.
Szerk: bocs, most látom, hogy már meglett, hogy a 'header' függvény '-type' paramétere maradt ki, és ezért a default ('text/html; charset=ISO-8859-1') érvényesült.