Newsgroup: it.comp.lang.javascript
Titolo: unicode

Salve,
si tratta di una cosa un po' tortuosa.
Premetto che in Flash esiste una proprietà useCodepage (true o false):
- se è false (è il nostro caso):
il Flash Player interpreta i file di testo esterni come Unicode;
- se è true:
il Flash Player interpreta i file di testo esterni usando il codepage 
tradizionale utilizzato dal sistema su cui gira il flash player;
Dunque, come dicevo, in Flash ricevo dei dati url-encoded Unicode da un 
file di testo. I dati servono di fatto a visualizzare una descrizione 
per ogni immagine presente nel file swf e per aprire dei popup.
Per la visualizzazione della descrizione nel file swf non ho alcun 
problema.
Il problema nasce quando vado ad aprire il popup: per fare ciò, da Flash 
passo al primo parametro del window.open un url dinamico che poi 
"spacchetto" nel popup, facendo scrivere a JavaScript il titolo del 
popup (unescape(titolo)).
In generale, non si pone alcun problema, tutto sembrerebbe funzionare 
correttamente. MA, se per caso nell'URL dovessero esserci delle lettere 
accentate, si presenta il seguente scenario:
1) se la stringa corrispondente all'URL è "encodata" di nuovo 
all'interno del file swf (encode(urlDinamico)):
_ Firefox:
- fa aprire i popup;
- il titolo del popup è corretto e leggibile;
_Explorer:
- fa aprire i popup;
- il titolo dei popup non è leggibile correttamente (appaiono caratteri 
illegibili in corrispondeza delle lettere accentate);
2) se la stringa è lasciata come è (cioè, come perviene a Flash dal file 
di testo esterno Unicode già url-encoded):
_Firefox:
- non apre il popup (fallisce silenziosamente, senza errori alla console);
_Explorer:
- apre il popup;
- il titolo del popup è leggibile correttamente;
Se l'escape viene dato direttamente dalla funzione JavaScript, si hanno 
errori di pagina non trovata.
Aggiungo che utilizzando l'escape in Flash il carattere viene 
rimpiazzato da una o più sequenze nella forma %xx, che rappresentano la 
sequenza UTF-8 del carattere. I caratteri del range Unicode 0-127 sono 
codificati come %xx, da 120-2047 come %xx%xx e i restanti come %xx%xx%xx 
("à" sarebbe ad esempio %C3%A0).
Ho notato che se nel file swf il codePage passa a true, il testo 
accentato (lo stesso del titolo del popup) viene reso esattamente allo 
stesso modo in cui lo rende IE nel caso 1: cioè male. La cosa mi fa 
pensare che IE possa avere dei problemi con Unicode.
Purtroppo, credo di dover scegliere l'estrema soluzione di far servire 
due swf differenti a seconda del browser, ma vorrei sapere se a qualcuno 
viene in mente qualche altra idea.
Grazie a tutti.
---

 popup (unescape(titolo)).
Prova ad utilizzare decodeURIComponent al posto di escape (che è
deprecato).
Es.:
var string = "cioè";
alert("original string = " + string);
var encodedString = encodeURIComponent(string);
alert("encoded string = " + encodedString);
var decodedString = decodeURIComponent(encodedString);
alert("decoded string = " + decodedString);
Gaetano

Ciao Gaetano,
e grazie per l'attenzione. Nel lungo post, mi sono dimenticato di dire 
che ho utilizzato (invano) sia decodeURI che decodeURIComponent, 
"encodando" l'url dalla funzione JavaScript e "decodificandolo" nel 
titolo della finestra.
Allo stato attuale delle cose, con PHP faccio un controllo ed attivo una 
variabile di sessione (che ha come valore il nome di un file swf) a 
seconda del risultato del controllo: dopodiché, passo il valore 
all'object e all'embed, ecc.ecc. Funziona magnificamente ma non č 
esattamente quello che avrei voluto.
Grazie mille.

 ("à" sarebbe ad esempio %C3%A0).
Solo un'idea:
Diciamo che richiami il pop up con un URL del tipo
www.foo.bar?titolo=stringa e visualizzi stringa come titolo dell'immagine.
Stringa e' codificata in UTF8 e ti crea problemi, per risolverli puoi
provare a sostituire alle codifiche UTF8 il codice Unicode corrispondente
ed usarlo per le entities in HTML.
Qualcosa del tipo:
// prendi il valore di titolo, ie stringa
par=location.search.split("=");
// sostituisci %20 con lo spazio
titoloutf8=par[1].replace(/%20/g," ");
// sostituisci UTF8 con entities 
titolounicode= titoloutf8.replace(/(%[^%]{2}?)(%[^%]{2}?)/g,
function(s,v1,v2){
	ms1=v1.substr(1,2);
	i1=parseInt(ms1,16);
	if(i1>192){
		ii1=i1&31;
		ms2=v2.substr(1,2);
		i2=parseInt(ms2,16);		
		ii2=i2&63;
		v=(ii1<<6)+ii2;
		vs="&#"+v+";";
		return vs;
	} else {
		return v1+v2;
	}
 });
 // il div che contiene il titolo
 t=document.getElementById('titolo');
 t.innerHTML=unescape(titolounicode);
Testato con Gecko e IE ma non in modo approfondito, comunque un url del
tipo <a href="prova.html?titolo=La via è nella città di Milano ma non è più
percorribile"> funziona ma non garantisco nulla :-)
'bye

 function(s,v1,v2){
[...]
N.B. si considerano solo i caratteri nel range 0-0x7ff che dovrebbero
contenere le accentate, con caratteri a codici maggiori non funziona :-)
Le specifiche di UTF8 nel caso interessino:
http://www.ietf.org/rfc/rfc3629.txt
'bye

Ciao Agostino,
ti ringrazio per la risposta: appena possibile posterň come č andata a 
finire. Di fatto pensavo anche di fare un'altra prova, cioč, lasciare 
all'esterno (leggi alla funzione JS) il compito di concatenare l'url.
Ciao,
Mauro


Ciao,
lascio qui una soluzione:
anche se si va un po' offtopic, può essere che un giorno torni utile 
anche a qualcun'altro.
Premetto che non ha funzionato, come suggerivo nell'ultimo post, l'idea 
di lasciare concatenare l'url direttamente alla funzione JavaScript, 
passando da Flash unicamente i parametri.
Ho fatto così: ho estratto l'unico elemento che potesse dare fastidio 
nell'url (il titolo, appunto) e l'ho passato ad una variabile di 
sessione in PHP prima di richiamare la funzione JavaScript da Flash.
Il popup stesso è stato realizzato in PHP ed i dati provenienti da 
Flash, passando per JavaScript, vengono adesso recuperati tramite $_GET.
Inizialmente, alla primissima prova, le cose sono andate male sia per IE 
che per Firefox. IE visualizzava i caratteri in maniera non corretta, 
mentre FF non apriva i popup nei cui titoli fossero presenti lettere 
accentate.
La prima soluzione che "ha funzionato" è stata questa:
<?php
echo ("<title>".utf8_decode($_SESSION['titolo'])."</title>")
?>
Dico "ha funzionato" tra virgolette perché questa cosa ha risolto il 
problema di IE, ma impediva ancora a FF di aprire i popup e di mostrare 
il titolo della finestra correttamente.
Sono tornato al file swf e ho encodato la stringa da inviare alla 
variabile di sessione: IE e FF hanno cominciato a comportarsi allo 
stesso modo (MALE, ma allo stesso modo: la cattiva visualizzazione dei 
caratteri era condivisa, i popup si aprivano).
La combinazione che rende i popup apribili e le scritte leggibili è la 
seguente:
<?php
echo ("<title>".utf8_decode(urldecode($_SESSION['titolo']))."</title>")
?>
http://it.php.net/utf8_decode
http://it2.php.net/urldecode
Aggiungo che non mi è ancora chiaro il perché l'estratto da un file 
UNICODE url-encoded, una volta caricato dal file swf debba essere 
ri-encodato con la stessa regola che lo ha generato per poter essere 
utilizzato.
Ciao, grazie,
Mauro