18

Sto scrivendo un'estensione per 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).Come si transcodifica una stringa Javascript in ISO-8859-1?

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'á viene visualizzato correttamente.

È a mia conoscenza che Javascript utilizza UTF-8 per le sue stringhe, quindi è la mia teoria che se devo 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 fissare la forma creata da usare iso-8859-1 come questo:

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 questo non sembra funzionare.

EDIT:

Il problema in realtà mentito nel modo in cui jQuery è stato urlencoding il messaggio (o qualcosa lungo la strada), Ho fissato questo dicendo jQuery non elaborare i dati e fare io stesso, come è mostrato nella seguente frammento:

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" 
    }); 
} 
+0

Come si invia il messaggio (ad esempio un esempio completo di errore del codice AJAX)? –

risposta

23

E 'la mia comprensione che Javascript utilizza UTF-8 per le sue corde

No, no.

Ogni pagina ha il suo circuito di codifica charset definito metatag, appena sotto elemento testa

<head> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 

o

<head> 
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"/> 

Oltre a ciò, ogni pagina deve essere modificato con la codifica bersaglio charset. Altrimenti, non funzionerà come previsto.

Ed è una buona idea definire la codifica del set di caratteri di destinazione 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 per impostare ogni file di script se utilizza caratteri sensibili (a, e, i, o, ú e così via ...).

<script type="text/javascript" charset="UTF-8" src="/PATH/TO/FILE.js"></script> 

...

Così è la mia teoria che se transcodificare la stringa da ISO-8859-1 prima di inviarlo, 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 davvero si vuole tradurre la codifica di destinazione charset, provare 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 è necessario fornire una funzione che ottiene la rappresentazione numerica, in Unicode Character Set, utilizzato da ogni 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("á")); 

Here è possibile vedere in azione:

È possibile utilizzare questo link come linea guida (Vedere sfugge JavaScript)

Aggiunto alla risposta originale come a implementare jQuery funcionality

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 alcun mal di testa.

Cordiali saluti,

+0

Grazie per la risposta informativa, la sto contrassegnando come corretta anche se questa non era esattamente la soluzione. Il mio post non ha dato abbastanza informazioni per mostrare il vero problema. (L'ho scoperto solo dopo aver sbattuto la testa contro il muro ancora per qualche ora) –

+0

@Marcos Marin Aggiunto il contenuto alla risposta originale –

+0

Per C#: <% @ Page RequestEncoding = "utf-8" ResponseEncoding = "utf -8 "%> –

4

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 quello di creare un link nella pagina originale, compresi 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 assegnare il valore href ad una variabile, in questo modo:

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

Quindi, finalmente il valore della variabile "theLink" era codificato ISO-8859-1 e tutto ha funzionato bene.

Problemi correlati