18

Ich schreibe eine Chrome-Erweiterung, die mit einer Website arbeitet, die ISO-8859-1 verwendet. Um etwas Kontext zu geben, macht meine Erweiterung das Posten in den Foren der Website schneller, indem sie ein bequemeres Postformular hinzufügt. Der Wert des Textfelds, in dem die Nachricht geschrieben wird, wird dann über einen Ajax-Aufruf (mit jQuery) gesendet.Wie kann ich eine Javascript-Zeichenfolge nach ISO-8859-1 umcodieren?

Wenn die Nachricht Zeichen wie á enthält, erscheinen diese Zeichen als Á in der geposteten Nachricht. Wenn der Browser gezwungen wird, UTF-8 anstelle von ISO-8859-1 anzuzeigen, wird á korrekt angezeigt.

Es ist mein Verständnis, dass Javascript UTF-8 für seine Strings verwendet, so ist es meine Theorie, wenn ich die Zeichenfolge nach ISO-8859-1 vor dem Senden transcodieren, sollte es mein Problem lösen. Es scheint jedoch keinen direkten Weg zu geben, diese Transcodierung in Javascript zu machen, und ich kann den serverseitigen Code nicht berühren. Irgendein Rat?

Ich habe versucht, das erstellte Formular Einstellung iso-8859-1 wie folgt zu verwenden:

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

Und auch:

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

Aber das scheint nicht zu funktionieren.

EDIT:

Das Problem belogen tatsächlich in wie jQuery wurde urlencoding die Nachricht (oder etwas in der Art und Weise), Ich reparierte diese indem ich jQuery nicht die Daten zu verarbeiten und es selbst zu tun, wie im folgenden gezeigt wird 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" 
    }); 
} 
+0

Wie übermitteln Sie die Nachricht (z. B. vollständiges Beispiel eines fehlgeschlagenen AJAX-Codes)? –

Antwort

23

Es ist mein Verständnis, dass Javascript UTF-8 für die Zeichenketten verwendet

Nein, nein.

Jede Seite hat ihr charset enconding in Meta-Tag definiert, gerade unterhalb Kopfelement

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

oder

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

Abgesehen davon, jede Seite soll mit der Zielzeichensatz-Codierung bearbeitet werden. Ansonsten wird es nicht wie erwartet funktionieren.

Und es ist eine gute Idee, die Ziel-Zeichensatzcodierung auf der Serverseite zu definieren.

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... 

Und es könnte eine gute Idee sein, jede Skriptdatei einzurichten, ob es sensible Zeichen verwendet (á, é, í, ó, ú und so weiter ...).

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

...

So ist es meine Theorie, dass vor dem Senden, wenn ich die Zeichenfolge ISO-8859-1 umcodieren, sollte es mein Problem

Keine lösen, Nein.

Der Zielserver konnte Strings in anderen als ISO-8859-1 verarbeiten. Zum Beispiel behandelt Tomcat in ISO-8859-1, egal wie Sie Ihre Seite einrichten. Auf der Serverseite müssen Sie also Ihre Anfrage entsprechend der Einrichtung Ihrer Seite einrichten.

Java 
request.setCharacterEncoding("UTF-8") 

PHP 
// I do not know how to... 

Wenn Sie wirklich das Ziel charset zu übersetzen, TRY wie folgt

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

Oder sollten Sie eine Funktion zur Verfügung stellen, die die numerische Darstellung von jedem verwendet wird, in Unicode-Zeichensatz, Charakter. Es funktioniert unabhängig von der Zielzeichensatzkodierung. Zum Beispiel ist á als Unicode-Zeichensatz \ 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 können Sie in Aktion sehen:

Sie diese link als Richtlinie verwenden können (siehe JavaScript entkommt)

hinzugefügt ursprüngliche Antwort, wie ich jQuery funcionality implementieren

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 
    }); 
}); 

Es funktioniert gut ohne Kopfschmerzen.

Grüße,

+0

Danke für die informative Antwort, ich habe es als richtig markiert, obwohl das nicht genau die Lösung war. Mein Beitrag hat nicht wirklich genug Informationen gegeben, um das eigentliche Problem zu zeigen. (Ich habe das erst erfahren, nachdem ich meinen Kopf noch ein paar Stunden gegen die Wand geschlagen hatte) –

+0

@Marcos Marin Inhalt der ursprünglichen Antwort hinzugefügt –

+0

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

4

Ich hatte ein sehr ähnliches Problem. Ich musste einen URL-Parameter mit JQuery übergeben, um einen Ajax-Aufruf zu machen, und die meisten Male Parameterwerte enthalten Akzente.

Beide Seiten mussten auf charset = ISO-8859-1 und Javascript-Funktionen gesetzt werden: encodeURI, encodeURIComponent usw. verwendet nur UTF-8.

Was ich tat, war, auf einen Link in der ursprünglichen Seite zu erstellen, einschließlich aller Parameter ohne Codierung, sagen wir mal:

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

und dann den href Wert einer Variablen zuweisen, wie folgt aus:

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

Also schließlich "Variable" theLink "Variable wurde ISO-8859-1 kodiert, und alles hat gut funktioniert.