Come faccio a transcodificare una stringa Javascript in ISO-8859-1?

Sto scrivendo un’estensione di Chrome che funziona con un sito Web che utilizza ISO-8859-1. Solo per dare un contesto, quello che la mia estensione fa è rendere più veloce la pubblicazione nei forum del sito aggiungendo un modulo di post più conveniente. Il valore della textarea in cui viene scritto il messaggio viene quindi inviato tramite una chiamata Ajax (utilizzando jQuery).

Se il messaggio contiene caratteri come á questi caratteri appaiono come à nel messaggio postato. Forzando il browser per visualizzare UTF-8 anziché ISO-8859-1, l’ á visualizzata correttamente.

Sono a conoscenza del fatto che Javascript usa UTF-8 per le sue stringhe, quindi è mia teoria che se dovessi transcodificare la stringa in ISO-8859-1 prima di inviarla, dovrebbe risolvere il mio problema. Tuttavia non sembra esserci alcun modo diretto per eseguire questa transcodifica in Javascript e non posso toccare il codice lato server. Qualche consiglio?

Ho provato a impostare il modulo creato per utilizzare iso-8859-1 in questo modo:

 var form = document.createElement("form"); form.enctype = "application/x-www-form-urlencoded; charset=ISO-8859-1"; 

E anche:

 var form = document.createElement("form"); form.encoding = "ISO-8859-1"; 

Ma non sembra funzionare.

MODIFICARE:

Il problema in realtà riguardava il modo in cui jQuery stava eseguendo l’urlencoding del messaggio (o qualcosa del genere), ho risolto questo problema dicendo a jQuery di non elaborare i dati e di farlo da solo come mostrato nel seguente snippet:

 function cfaqs_post_message(msg) { var url = cfaqs_build_post_url(); msg = escape(msg).replace(/\+/g, "%2B"); $.ajax({ type: "POST", url: url, processData: false, data: "message=" + msg + "&post=Preview Message", success: function(html) { // ... }, dataType: "html", contentType: "application/x-www-form-urlencoded" }); } 

È a mia conoscenza che Javascript utilizza UTF-8 per le sue stringhe

No, no.

Ogni pagina ha la sua codifica charset definita nel meta tag, appena sotto l’ elemento head

   

o

   

Oltre a ciò, ogni pagina dovrebbe essere modificata con la codifica del set di caratteri di destinazione . Altrimenti, non funzionerà come previsto.

Ed è una buona idea definire la codifica del charset target sul lato server.

 Java <%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%> PHP header("Content-Type: text/html; charset=UTF-8"); C# I do not know how to... 

E potrebbe essere una buona idea impostare ogni file di script se utilizza caratteri sensibili (á, é, í, ó, ú e così via …).

  

Quindi è la mia teoria che se transcodifico la stringa in ISO-8859-1 prima di inviarla, dovrebbe risolvere il mio problema

No, no.

Il server di destinazione può gestire stringhe diverse da ISO-8859-1 . Ad esempio, Tomcat gestisce in ISO-8859-1, indipendentemente dalla configurazione della pagina. Quindi, dal lato server, potresti dover impostare la tua richiesta in base alla configurazione della tua pagina.

 Java request.setCharacterEncoding("UTF-8") PHP // I do not know how to... 

Se vuoi veramente tradurre la codifica del set di caratteri target, prova come segue

 InternetExplorer formElement.encoding = "application/x-www-form-urlencoded; charset=ISO-8859-1"; ELSE formElement.enctype = "application/x-www-form-urlencoded; charset=ISO-8859-1"; 

O dovresti fornire una funzione che ottenga la rappresentazione numerica, in Unicode Character Set, usata da ciascun carattere. Funzionerà indipendentemente dalla codifica del set di caratteri di destinazione. Ad esempio, come set di caratteri Unicode è \ u00E1;

 alert("á without its Unicode Character Set numerical representation"); function convertToUnicodeCharacterSet(value) { if(value == "á") return "\u00E1"; } alert("á Numerical representation in Unicode Character Set is: " + convertToUnicodeCharacterSet("á")); 

Qui puoi vedere in azione:

Puoi usare questo link come linea guida (Vedi escape di JavaScript)

Aggiunto alla risposta originale come implemento la funzionalità di jQuery

 var dataArray = $(formElement).serializeArray(); var queryString = ""; for(var i = 0; i < dataArray.length; i++) { queryString += "&" + dataArray[i]["name"] + "+" + encodeURIComponent(dataArray[i]["value"]); } $.ajax({ url:"url.htm", data:dataString, contentType:"application/x-www-form-urlencoded; charset=UTF-8", success:function(response) { // proccess response }); }); 

Funziona bene senza mal di testa.

Saluti,

Ho avuto un problema molto simile. Avevo bisogno di passare un parametro URL usando JQuery per fare una chiamata ajax, e la maggior parte delle volte i valori dei parametri includevano accenti.

Entrambe le pagine dovevano essere impostate su charset = ISO-8859-1 e le funzioni di javascript: encodeURI, encodeURIComponent etc. utilizza solo UTF-8.

Quello che ho fatto è stato creare un link nella pagina originale, inclusi tutti i parametri senza alcuna codifica, diciamo:

 var myLink = document.getElementById("myHiddenLink"); myLink.setAttribute("href", "México, Perú, María and any other words with accents and spaces"); 

e quindi assegna il valore href a una variabile, come questo:

 var theLink = myLink.getAttribute("href"); 

Quindi, alla fine il valore della variabile “theLink” era codificato ISO-8859-1 e tutto ha funzionato bene.