Newsgroup: it.comp.lang.perl
Titolo: Come codificare le lettere accentate?

Ciao,
premetto che non so nulla di Perl, tuttavia sono riuscito a creare un
uploader.
Form.html passa alcuni parametri testuali ed un file ad Upload.pl il
quale effettua l'upload e chiama Redirect.php.
Bene, in perl il file lo prendo e lo salvo senza problemi. Chiamare
Redirect.php e passargli i campi del orimo form non funziona.
Il problema sta nelle lettere accentate. Ho provato di tutto: encode
("iso-8859-1"), encode_entities( ... ), uri_escape(…),
CGI::escapeHTML... ma nulla.
In questa immagine trovate una tabella con il risultato di ciascuna di
quelle funzioni:
http://www.orchestralparts.com/special_char.jpg
Nella prima riga c'è la lettera digitata dall'utente nel form, 2 e
3rza colonna è il valore che spero poter generare in Perl, le altre
sono il risultato delle varie funzioni.
Possibile che non riesca ad ottenere un &agrave; con nessuna di queste
funzioni?
thx

 funzioni?
ï¿½ banalmente il solito problema di encoding.
Dalla tabella che hai postato, il tuo input sembra codificato in UTF-8, 
quindi prima di darlo in pasto a Perl, dovresti /decodificarlo/ (nel 
formato interno di Perl).
Questa ï¿½ la riproduzione della tua situazione, in una console UTF-8:
$ perl -MHTML::Entities -e 'print encode_entities("ï¿½")'
&Atilde;&nbsp;
e questa ï¿½ la soluzione, che consiste, appunto, nel decodificare l'input 
(UTF-8) prima di qualsiasi elaborazione:
$ perl -MHTML::Entities -MEncode -e 'print encode_entities( 
decode("UTF-8", "ï¿½") )'
&agrave;
se il tuo input non fosse UTF-8, dovresti ovviamente adeguare il primo 
parametro della funzione decode (ci sarebbero poi metodi piï¿½ eleganti 
che usare esplicitamente Encode::decode - tramite PerlIO, nel caso 
avessi voglia di vedertelo...)
P.S.
Giï¿½ che ci sei lascia php e fa tutto con Perl ;-)

Grazie... ma non sono ancora alla fine.
Riesco a prendere il valore e a convertirlo in maniera corretta, però
il Php che lo riceve lo interpreta male.
In Perl dopo un:
print "content-type:text/html; charset=utf-8\n\n";
La pagina genera il seguente codice:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
">
<html xmlns="
http://www.w3.org/1999/xhtml
">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form action="xxx.php" method="post">
<input type="hidden" name="variabile" value="&agrave; &egrave;
&igrave; &ograve; &ugrave; &euro; &#39; &quot;" />
<input type="submit" value="Continua...">
</form>
</body>
</html>
Dovrebbe essere tutto ok però il Php continua a ricevere cose strane.
Quel form se generato in Php con action se stesso non ha problemi, se
invece lo stesso codice lo genera uno script in Perl allora il Php non
comprende il valore di "variabile".
E questo è molto divertente. Lo ripeto per cercare di essere il più
chiaro possibile. Se quel codice è generato da una pagina php (con o
senza il meta sul charset) una pagina in php riceve le variabili in
maniera corretta. Se invece lo stesso identico form lo ha generato una
pagina in Perl allora la pagina php che lo riceve interpreta malissimo
i valori passati.

 i valori passati.
Capisci bene che non può essere.
Se le due pagine html (con dentro le form) fossero veramente
identiche, al server perverrebbero dati identici e php non avrebbe
alcun modo di fare distinzioni (sempre nell'ipotesi che non ci siano
altre cose che non hai detto, tipo cookie e/o sessioni server-side
popolate in maniera diversa nei due casi di Perl e php...)
Prova a debuggare l'invio dei dati della form con Firebug o tool
equivalente e vedrai che qualche differenza c'è (che di conseguenza
vuol dire che c'era qualche differenza nelle pagine - sempre
nell'ipotesi di applicazione stateless).
Se non riesci a rilevare alcuna differenza, prova a postare qui il
codice html (ridotto al minimo) completo delle due pagine, quella
generata da Perl e quella generata da php.
Ciao.

 i valori passati.
Devi controllare il contenuto dell'header per ogni invio, ci sono
diversi programmi che ti permettono di osservarlo, uno di questi è il
plugin di FF LiveHTTPHeaders
http://livehttpheaders.mozdev.org/
osservando gli headers puoi facilmente rilevare le differenze