Newsgroup: it.comp.lang.perl
Titolo: XMLHttpRequest e charset utf8, qualcosa non funziona (crosspost)

Riporto un post che ho inviato al gruppo it.comp.lang.javascript, dato
che uso una combinazione di script Perl - Javascript è possibile che
sia inerente anche a questo gruppo.
Ho scritto un programmino Perl che mi legge una tabella in un database
mysql e mi restituisce un tag html label con il titolo ed un tag html
select completo di tutti i dati. Fin qui tutto bene
Quando chiamo lo script da browser ho il titolo con caratteri estesi
strani (non interpretati correttamente) e la lista di select perfetta
con tutti i caratteri estesi in ordine. I caratteri estesi sono vocali
con l'accento, la c cediglia ecc..
Quando chiamo lo script da XMLHttpRequest per riempire un tag html div
ecco che ho il titolo (tag label) con i caratteri correttamente
visualizzati mentre la lista (tag select) mostra un rombo nero con un
punto interrogativo al posto dei caratteri estesi.
Da notare che il javascript viene chiamato nel modo seguente
<script type="text/javascript" charset="UTF-8" src="../js/navtab.js"></
script>
cioè con l'indicazione charset="UTF-8"
La pagina con il div da riempire riporta il suo bel meta con
charset=UTF-8
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
come se non bastasse per scrupolo anche le chiamate css hanno
charset=UTF-8
<link href="../css/navtab_ff.css" rel="stylesheet" type="text/css"
charset="UTF-8" />
Ho provato anche ad inserire nel codice javascript
getAllResponseHeaders() ed ho osservato il seguente messaggio Transfer-
Encoding: chunked Content-Type: text/html
Mi sembra tutto in ordine, però non riesco a spiegare la differenza
fra la chiamata diretta da browser e quella per mezzo di
XMLHttpRequest.
Qualcuno ha avuto lo stesso problema?
Grazie in anticipio a chi voglia rispondere
www.oreste.parlatano.com

 soluzione al di fuori della mia mente.
Guarda, non è la prima volta che qualcuno si presenta con problemi di questo
tipo. La difficoltà, per chi vuole offrire aiuto, è che per lo più (e tu
non fai eccezione) l'utente racconta quello che vede a video (triangolini,
caratterini strani, palline, faccine) senza spiegare che cosa esattamente
restituisce il server.
Ad ogni modo, in linea di massima di solito vale quanto segue:
 - se vedi una sequenza di due caratteri dove dovrebbe essercene uno solo,
allora lì c'è una sequenza UTF-8, ma il browser "pensa" che sia ISO-8859-X
 - se con Firefox vedi un rombo con punto di domanda, significa che c'è un
byte che non può essere interpretato come una sequenza UTF-8 valida.
Probabilmente, lì c'è un carattere ISO-8859-X, ma il browser "pensa" che
debba essere UTF-8.
Se tu mettessi online qualcosa che consenta alla gente di riprodurre il
problema, la soluzione ti arriverebbe immediatamente. Comunque, come prima
cosa:
 1. verifica qual è il charset che dichiara il server
 2. verifica se le sequenze di byte restituite dal server sono coerenti
 con il charset dichiarato
Ad esempio, se vedi che un singolo carattere è codificato con una sequenza
di 2 o più byte e il charset dichiarato è un ISO-8859-qualcosa, allora c'è
qualcosa che non va.
Inoltre, il charset dichiarato via <meta>/HTTP-Equiv ha effetto su una
pagina visualizzata "normalmente", ma non viene preso in considerazione se
il contenuto HTML viene recuperato con XHR e inserito via innerHTML.
Max

 il contenuto HTML viene recuperato con XHR e inserito via innerHTML.
Grazie Max, questo risponde al mio dubbio cioè che devo concetrare lo
studio su XHR e innerHTML. Non ho indicato il link perchè fa parte di
un'area protetta da password. Ho analizzato anche gli HTTP header
senza notare una significativa differenza fra la chiamata Ajax e
quella diretta allo script Perl.
Appena trovo, semmai la troverò, una soluzione la invio subito.

 problema, la soluzione ti arriverebbe immediatamente. Comunque, come prima
Ecco i link in zona pubblica:
1. chiamata via XMLHttpRequest
http://mhn.museumoz.org/suporte2.html
2. chiamata diretta sulla prima tabella
http://mhn.museumoz.org/cgi-bin/suporte2.pl?tabxx=tab01
spero tu abbia voglia e tempo per dare un'occhiata
Ciao

 
Ti ho risposto su i.c.l.js.
Max