[☺]Perl, unicode, html, ☺

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

<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.

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 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

"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).

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):

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.

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 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

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.