2008-08-25 17 views
36

In meiner Webanwendung reiche ich einige Formularfelder mit jQuery $.getJSON() Method ein. Ich habe einige Probleme mit der Codierung. Der Zeichensatz meiner App ist charset=ISO-8859-1, aber ich denke, dass diese Felder mit UTF-8 eingereicht werden.So stellen Sie die Codierung in .getJSON ein JQuery

Weiß jemand, wie kann ich Codierung in $.getJSON Anrufe setzen?

+1

nach [dieser] (http://stackoverflow.com/a/13098683/95735) Antwort i Es ist illegal charset für 'application/json' anzugeben. –

+1

** ILLEGAL? ** Ich hoffe, ich werde nicht verhaftet für den Versuch ... – jbowman

Antwort

32

Ich denke, dass Sie wahrscheinlich $.ajax() verwenden, wenn Sie die Codierung ändern möchten, finden Sie in der contentType param unten (die success und error Rückrufe annehmen, dass Sie <div id="success"></div> und <div id="error"></div> in den HTML-Code haben):

$.ajax({ 
    type: "POST", 
    url: "SomePage.aspx/GetSomeObjects", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    data: "{id: '" + someId + "'}", 
    success: function(json) { 
     $("#success").html("json.length=" + json.length); 
     itemAddCallback(json); 
    }, 
    error: function (xhr, textStatus, errorThrown) { 
     $("#error").html(xhr.responseText); 
    } 
}); 

Ich musste das eigentlich vor einer Stunde tun, was für ein Zufall!

+1

Ich habe gerade herausgefunden, dass Sie XMLHttpRequest-Host-Objekt innerhalb der Fehlermethode überschreiben. Es ist nur eine Frage der guten Programmierpraxis, andere Entwickler nicht zu verwirren;) Ich würde vorschlagen, sie in etwas anderes umzubenennen;) – Wilq32

+0

Wie klingt 'xhr'? ;-) – travis

+0

Viel besser :) (eigentlich nenne ich es normalerweise dasselbe wie du:>) – Wilq32

42

Wenn Sie verwenden möchten $.getJSON() Sie können die folgenden vor dem Aufruf hinzu:

$.ajaxSetup({ 
    scriptCharset: "utf-8", 
    contentType: "application/json; charset=utf-8" 
}); 

Sie das charset Sie statt utf-8 wollen verwenden können.

Die Optionen werden erläutert here.

contentType : Wenn Sie Daten an den Server senden, verwenden Sie diese content-type. Standard ist application/x-www-form-urlencoded, was in den meisten Fällen in Ordnung ist.

scriptCharset : Nur für Anfragen mit jsonp oder script dataType und GET type. Erzwingt, dass die Anfrage als ein bestimmter Zeichensatz interpretiert wird. Wird nur für Zeichenunterschiede zwischen dem Remote- und dem lokalen Inhalt benötigt.

Sie eines oder beide ... brauchen

+3

hi Pat, ich habe das selbe Problem beim Festlegen des Inhaltstyps mit der Methode getJSON.Ich habe $ .ajaxSetup direkt vor dem Aufruf von getJSON verwendet, aber es treten keine Änderungen auf, die "nordischen" Zeichen werden zu Junk-Zeichen in meiner Datenbank. Könnten Sie mir bitte die genaue Reihenfolge des Aufrufs von Mathods sagen? thnx – Bhupi

+1

Laut [this] (http://stackoverflow.com/a/13098683/95735) antwort es ist illegal charset für 'application/json' anzugeben. –

+0

Ich hatte ein ähnliches Problem mit dem Post und verwendete $ .ajax (...) call anstelle von $ .post (...), weil ich keine Möglichkeit hatte, den Inhaltstyp zu ändern. Dies erlaubt mir, die abgekürzte $ .post-Notation zu verwenden, um das $ .get, das ich verwende, zu vergleichen. Ich glaube, das sollte die akzeptierte Antwort sein, weil es funktioniert und die Verwendung von $ .getJSON() erlaubt. – eesh

1

Verwenden encodeURI() in Client JS und URLDecoder.decode() in Server Java Seite Arbeiten verwenden.


Beispiel:

  • Javascript:

    $.getJSON(
        url, 
        { 
         "user": encodeURI(JSON.stringify(user)) 
        }, 
        onSuccess 
    ); 
    
  • Java:

    java.net.URLDecoder.decode(params.user, "UTF-8");

4

Sie benötigen die JSON-Anrufe mit Wireshark zu analysieren, so dass Sie sehen, wenn Sie die charset in der Bildung der JSON-Seite oder nicht, zum Beispiel umfassen:

  • Wenn die Seite einfach, wenn text/html
 
0000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK. 
0010 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74 .Content -Type: t 
0020 65 78 74 2f 68 74 6d 6c 0d 0a 43 61 63 68 65 2d ext/html ..Cache- 
0030 43 6f 6e 74 72 6f 6c 3a 20 6e 6f 2d 63 61 63 68 Control: no-cach 
  • Wenn die Seite des Typs, der Brauch ist JSON mit MIME "charset = ISO-8859-1"
 
0000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK. 
0010 0a 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 .Cache-C ontrol: 
0020 6e 6f 2d 63 61 63 68 65 0d 0a 43 6f 6e 74 65 6e no-cache ..Conten 
0030 74 2d 54 79 70 65 3a 20 74 65 78 74 2f 68 74 6d t-Type: text/htm 
0040 6c 3b 20 63 68 61 72 73 65 74 3d 49 53 4f 2d 38 l; chars et=ISO-8 
0050 38 35 39 2d 31 0d 0a 43 6f 6e 6e 65 63 74 69 6f 859-1..C onnectio 

Warum ist das? weil wir nicht auf der Seite von JSON ein Ziel so sagen kann:

In meinem Fall habe ich mit dem Hersteller in Verbindung Me 9210 Digi verwenden:

  • ich eine Flagge zu verwenden hätte, um anzuzeigen, dass man verwenden Nicht-Standard-MIME: p-> theCgiPtr-> = fDataType eRpDataTypeOther;
  • Es hinzugefügt das neue MIME in der Variablen: strcpy (p-> derCgiPtr-> fOtherMimeType, "Text/html; Zeichensatz = ISO-8859-1");

Es funktionierte für mich, ohne die Daten von JSON für UTF-8 weitergegeben konvertieren zu müssen und dann wiederholen Sie die Konvertierung auf der Seite ...

0

Mit dieser Funktion kann das utf-8-Zeichen wieder

function decode_utf8(s) { 

    return decodeURIComponent(escape(s)); 

} 

Beispiel:

var new_Str=decode_utf8(str);