Frage

Ich schreibe eine Chrome-Erweiterung, dass die Arbeiten mit einer Website, die ISO-8859-1 verwendet. Nur einigen Kontext zu geben, was meine Erweiterung nicht in der Website-Foren schneller durch das Hinzufügen einer bequemeren Post Form machen Posting. Der Wert des Textbereiches, wo die Nachricht geschrieben wird, wird dann durch einen Ajax-Aufruf (mit jQuery) gesendet.

Wenn die Nachricht Zeichen wie á enthält erscheinen diese Zeichen als á in der entsandte Nachricht. Erzwingen der Browser-Anzeige UTF-8 statt ISO-8859-1 macht die á korrekt angezeigt werden.

Es ist mein Verständnis, dass Javascript verwendet UTF-8 für die Saiten, so ist es meine Theorie ist, dass, wenn ich die Zeichenfolge ISO-8859-1 vor dem Senden umcodieren, sollte es mein Problem zu lösen. Allerdings scheint es keine direkte Möglichkeit, diese Umcodierung in Javascript zu tun, und ich kann nicht den Server-seitigen Code berühren. Jede Beratung?

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

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

EDIT:

Das Problem belogen tatsächlich in wie jQuery wurde urlencoding die Nachricht (oder etwas in der Art und Weise), feste ich dies sage jQuery nicht die Daten zu verarbeiten und tun es selbst, wie es im folgenden Ausschnitt gezeigt:

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"
  });
}
War es hilfreich?

Lösung

  

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

Nein, nein.

Jede Seite hat ihre charset in Meta-Tag definiert enconding, knapp unter 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"/>

Außerdem, jede Seite sollte mit dem Ziel charset bearbeitet werden. Andernfalls wird es nicht funktionieren wie erwartet.

Und es ist eine gute Idee sein Ziel charset auf Server-Seite 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, wenn ich die Zeichenfolge ISO-8859-1 vor dem Senden umcodieren, sollte es mein Problem lösen

Nein, nein.

Der Zielserver konnte Strings in anderen handhaben als ISO-8859-1 . Zum Beispiel Tomcat Griffe in ISO-8859-1, egal wie setzen Sie Ihre Seite nach oben. Also, auf Server-Seite, könnten Sie haben Ihre Anfrage nach, wie Sie Ihre Einrichtung Ihrer Seite einrichten.

Java
request.setCharacterEncoding("UTF-8")

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

Wenn Sie wirklich das Ziel charset übersetzen wollen, versuchen Sie folgt als

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 Sie sollten eine Funktion zur Verfügung stellen, die die numerische Darstellung erhält, in Unicode-Zeichensatz, von jedem Zeichen verwendet. Es wird unabhängig von dem Ziel charset arbeiten. Zum Beispiel kann ein als Unicode-Zeichensatz ist \ 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("á"));

Hier in Aktion sehen können:

Sie können mit dieser Link als Leitlinie (siehe JavaScript entkommt)

Original Antwort hinzugefügt, wie ich implementieren 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
    });
});

Es funktioniert gut, ohne Kopfschmerzen.

Grüße,

Andere Tipps

Ich hatte ein sehr ähnliches Problem. Ich brauchte einen URL-Parameter mit JQuery zu übergeben einen Ajax-Aufruf zu machen, und die meisten der Zeit-Parameter-Werte enthalten Akzente.

hatten beide Seiten charset = ISO-8859-1 und Javascript Funktionen eingestellt 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 ordnen Sie den href Wert einer Variablen, wie folgt aus:

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

So endlich "TheLink" Variablenwert war ISO-8859-1 codiert, und alles funktionierte gut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top