2012-11-29 16 views
9

Questa è la mia prima domanda su Stack Overflow. Non è la prima volta che ho voluto scriverne uno, ma di solito trovo una soluzione usando la barra di ricerca, questa volta non l'ho fatto. Il problema che sto affrontando è un po 'complesso quindi cercherò di essere il più accurato possibile.AS3 Flash - rendering html tramite ExternalInterface

Fondamentalmente stiamo aggiungendo pagamenti cinesi a un e-commerce già esistente in Flash. L'intero sito Web è in AS3, incorporato tramite SWFObject, che già utilizza ExternalInterface per altre cose.

Questo nuovo metodo di pagamento cinese è un po 'vecchio stile, quindi hanno uno strano modo di gestire i pagamenti. Una volta inviato un POST ai loro server con tutti i dettagli dell'ordine, rispondono con una pagina HTML. Il mio problema è il rendering di questa pagina, considerando che la ricevo all'interno di Flash.

La soluzione che sto provando in questo momento funziona parzialmente, il che significa che sono in grado di vedere la pagina, ma i caratteri cinesi che dovrebbero essere nella pagina non vengono visualizzati correttamente. Invece dei caratteri cinesi vedo strani personaggi, quindi suppongo che debba esserci un problema di codifica quando passo l'HTML da Flash a Javascript. Questo è come lo sto facendo:

AS3:

//extract html page from response 
var newHTML:String = e.currentTarget.data; 
//trim whitespace to avoid javascript error 
newHTML = newHTML.replace(/\n/g, ''); 
newHTML = newHTML.split("\r").join(""); 

if(ExternalInterface.available) 
    ExternalInterface.call("chinesePayment('"+newHTML+"')"); 
else 
    trace("External interface error"); 

Javascript:

function chinesePayment(param) { 
    var newWindow = window.open(); 
    //var unescaped = unescape(param); 
    newWindow.document.write(param); 
} 

ho provato pasticciare con unescape, fuga, URIEncoding ma senza alcun successo, così ho spero davvero che tu possa aiutarmi qui!

Grazie, Domenico

EDIT:

Vorrei solo ricordare che sto ricevendo una pagina HTML corretto dai loro server. Ho provato a salvare la pagina localmente, copiando il codice HTML direttamente dalla risposta del server e le visualizzazioni di pagina correttamente. Ciò significa che ci deve essere qualcosa di sbagliato nel processo di passaggio della pagina da AS3 a Javascript.

EDIT2 importante:!

mi sono reso conto che il problema risiede nella codifica a comparsa. Quando copio l'HTML dal popup, lo incollo in un editor e lo salvo posso visualizzare correttamente l'HTML. Sembra che il popup non consideri la codifica gbk. Sto cercando una soluzione a questo problema.

+0

Se si esegue il dump di tali dati tramite dire FileReference, quindi aprirlo come HTML, funziona correttamente nel browser? – Vesper

+0

Non l'ho provato, anche perché questa non può essere una soluzione finale. Visto che questo sito riceve molti ordini, vorrei evitare di creare pagine statiche per ogni ordine. In ogni caso, ho provato a inserire un punto di interruzione in flash, copiare l'html e incollarlo in editore. Una volta salvato il file, il rendering era corretto, quindi l'html va bene fino a lì. Proverò questa soluzione solo per vedere se funziona, quindi ti faccio sapere come va. – aberonni

+0

No, intendo per testare se si riceve una pagina HTML corretta e se ha tutti i metadati impostati correttamente e altre cose. Se si formerà correttamente nel browser se trasferito via file, allora si riceverà un codice HTML corretto e sarà necessario scavare in JS per gestire ulteriormente le stringhe HTML - Non ho conoscenza se qualcosa può funzionare male nel processo. In caso contrario, riceverai un codice HTML errato/incompleto o mancherai di caratteri sul tuo sistema, oppure ci sono altre cause non di programmazione del comportamento che osservi. – Vesper

risposta

2

Ho finalmente trovato una soluzione !!!!

Fondamentalmente dovevo rendere i caratteri cinesi in flash in modo che quando li passavo a javascript fossero già codificati. Quindi prima di tutto ho dovuto cambiare il tipo di URLLoaderDataFormat di binario in maniera tale ho ricevuto un ByteArray:

my_loader.dataFormat = URLLoaderDataFormat.BINARY; 

Una volta ho ricevuto la risposta che ho modificato il codice in questo modo:

 var bytes:ByteArray = e.currentTarget.data; 
     var newHTML:String = bytes.readMultiByte(bytes.length,"gb2312"); 
     //trim whitespace to avoid javascript error 
     newHTML = newHTML.replace(/\n/g, ''); 
     newHTML = newHTML.split("\r").join(""); 

     if(ExternalInterface.available) 
      ExternalInterface.call("chinesePayment('"+newHTML+"')"); 
     else 
      trace("External interface error"); 

come si può vedi, grazie ad una specifica funzione di byteArray posso leggere la risposta usando il set di caratteri preferito, e ora funziona!

Il javascript è rimasto lo stesso, senza unescape o simili.In questo modo la funzione javascript ha ricevuto una stringa con i caratteri cinesi al suo interno, non con i caratteri utf equivalenti.

Grazie a tutti, mi avete aiutato ad arrivare alla soluzione!