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...
- 1015 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
Nagyon érdekes dolgot mondasz. A Perl legenerálja a
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
sort az
-encoding=>'UTF-8',
sor örömére. A curl pedig megerősítette a feltételezésedet.
A
print header;
sort módostítottam
print header(-charset=>'utf-8');
-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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
a html forras jobban tudja, hogy o milyen encodingban van, mint a webserver, ami kiszolgalja. Szoval az utobbit kellett volna prioritassal kezelni.
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
- A hozzászóláshoz be kell jelentkezni
"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).
- A hozzászóláshoz be kell jelentkezni
Jogos.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Pedig mind a HTTP, mind a HTML szabvány egyértelműen fogalmaz, nincs logikátlanság:
RFC 2616 (HTTP 1.1):
3.7.1 Canonicalization and Text Defaults
(...)
The "charset" parameter is used with some media types to define the
character set (section 3.4) of the data. When no explicit charset
parameter is provided by the sender, media subtypes of the "text"
type are defined to have a default charset value of "ISO-8859-1" when
received via HTTP. Data in character sets other than "ISO-8859-1" or
its subsets MUST be labeled with an appropriate charset value. See
section 3.4.1 for compatibility problems.
HTML5
8.2.2.1 Determining the character encoding
(...)
If the transport layer specifies an encoding, and it is supported, return that encoding with the confidence certain, and abort these steps.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
És a HTML-be hogyan nézünk bele, ha nem tudjuk, milyen kódolású? :)
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni