Ist es möglich, den Accept-Zeichensatz für ein neues Formulardaten (XHR2) -Objekt oder eine Problemumgehung festzulegen

StackOverflow https://stackoverflow.com//questions/22046930

Frage

Hier ist ein Beispielcode (http://jsfiddle.net/epsSZ/1/):

HTML:

<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="windows-1251">
  <label>Label:</label>
  <input type="text" name="label" size="12" maxlength="32" value="får løbende" /><br />
  <input type="submit" value="Send standart">
</form>
<button onclick="sendForm()">Send ajax!</button>

JS:

window.sendForm = function() {
  var oOutput = document.getElementById("output"),
     oData = new FormData(document.forms.namedItem("fileinfo"));
  var oReq = new XMLHttpRequest();
  oReq.open("POST", "/echo/html", true);
  oReq.send(oData);
}

Wenn ich diesen alten Weg über das Standardformular absende, sieht die Nutzlast der Anforderung folgendermaßen aus:

------WebKitFormBoundary2890GbzEKCmB08rz
Content-Disposition: form-data; name="label"

f&#229;r l&#248;bende

Aber wenn ich diesen AJAX-Weg einreiche, dann sieht es etwas anders aus:

------WebKitFormBoundaryPO2mPRFKj3zsKVM5
Content-Disposition: form-data; name="label"

får løbende

Wie Sie sehen, werden im ersten Fall einige Zeichen durch Zeichenentitäten ersetzt, aber im Falle der Verwendung von FormData es gibt eine einfache Zeichenfolge, was natürlich gut ist, weil es utf-8 ist, aber gibt es eine Möglichkeit, dass es sich wie ein Standardformular verhält?

War es hilfreich?

Lösung

Die Antwort auf Ihre Frage lautet Nein.Sie können es nicht ändern.GEM XMLHttpRequest2 TR, FormData konstruierte Daten sind explizit kodiert zu UTF-8.Ohne zu erwähnen, dass es erlaubt ist, es zu ändern.

Der übliche Zeichensatz mimeType oder Content-Type= wird für mehrteilige Anforderungen ungültig, da er aus genau demselben Grund anders behandelt wird.

Zitieren,

Wenn Daten Formulardaten sind Der Anforderungsentitätskörper sei das Ergebnis der Ausführung des mehrteiligen / Formulardatencodierungsalgorithmus mit Daten als Formulardatensatz und mit UTF-8 als explizite Zeichenkodierung.

Sei der MIME-Typ die Verkettung von "multipart / Formulardaten;", einem U + 0020-Leerzeichen, "boundary =" und der vom Multipart / Formulardatencodierungsalgorithmus generierten mehrteiligen / Formulardaten-Grenzzeichenfolge.

Hoffe das hilft!

Update

Wenn Sie bereit sind zu verzichten

new FormData(document.forms.namedItem("fileinfo"));

für

new FormData().append("name", "value")

es könnte eine praktikable Lösung möglich sein.Lass es mich wissen, wenn es das ist, wonach du suchst.

Ein weiteres Update

Bin ein bisschen rumgelaufen. Aktualisierte Geige mit allen Modi

Das ist also die Geschichte,

1 form with accept-charset="utf8" => Standardverhalten

Der Inhalt erfordert keine zusätzliche Maskierung / Kodierung.Die Anfrage wird also mit intaktem Text ausgelöst als får løbende

2 form with accept-charset="windows-1251" => ihr Fall

Der Inhalt erfordert zusätzliches Escaping / Encoding, da der Standardzeichensatz des Browsers hier utf8 ist.Der Inhalt wird also maskiert und dann abgefeuert, d. H.der gesendete Inhalt ist f&#229;r l&#248;bende

3 FormData constructed with form element

Der Inhalt erfordert kein zusätzliches Escaping / Encoding, da er standardmäßig verwendet wird utf8.Die Anfrage wird also mit Text als ausgelöst får løbende.

4 FormData constructed, and then appended with escaped data

Der Inhalt ist immer noch in der utf8-Codierung, aber es tut nicht weh, anzurufen escape(content) vor dem Anhängen an die Formulardaten.Dies bedeutet, dass die Anforderung mit folgendem Text ausgelöst wird f%E5r%20l%F8bende.Immer noch keine Würfel, oder?

Ich habe mich geirrt, nein.Genauer hinschauen [lesen => ein paar Minuten starren....] an

f&#229;r l&#248;bende und

f%E5r%20l%F8bende

Dann passte alles zusammen - %E5 (Hexadezimal) = &#229; (Dezimal).Also im Grunde genommen escape()ist Javascript die Art, Dinge zu tun, die % basierte Codierung, die nicht HTML-freundlich ist.

Ähnlich &#;, wie wir wissen, ist die Art der Codierung von HTML.Also habe ich Ajax einen anderen Modus gegeben, [was Sie suchen, schätze ich]

5 FormData constructed, and then appended with html-escaped data

Der Inhalt ist immer noch in UTF8-Codierung.Tut nicht weh, es wie HTML-Codierung zu entkommen, mit diesem wunderbaren Stück Code von stackoverflow.Und voila, die Anfrage wurde mit dem Text ausgelöst f&#229;r l&#248;bende

Aktualisierte Geige mit allen Modi

Hoffe, das hilft, es zu klären!

UPDATE für Windows-1251 volle Unterstützung

Dieser привет får løbende die Eingabe ist im früheren Modus 5 fehlgeschlagen.Geige aktualisieren http://jsfiddle.net/epsSZ/6/.

Verwendet hier eine Kombination von Lösungen https://stackoverflow.com/a/2711936/1304559 und meine.Das Problem ist also, allem zu entkommen.Jetzt werden also nur Zeichen maskiert, die im Windows-1251-Zeichensatz nicht vorhanden sind.

Das hilft, hoffe ich!

Andere Tipps

Danke für diese Frage, ich habe mich amüsiert!:)
Ersetzen

<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="windows-1251">

von

<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="utf-8">

Das Problem ist, dass der accept-Zeichensatz ist windows-1251 statt utf-8

Nach

oReq.open("POST", "/echo/html", true);

sie können auch hinzufügen

oReq.overrideMimeType('text/html; charset=UTF-8');
oReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

aber das behebt das Problem nicht.

Glück.:)

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