Ist es möglich, den Accept-Zeichensatz für ein neues Formulardaten (XHR2) -Objekt oder eine Problemumgehung festzulegen
-
21-12-2019 - |
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år lø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?
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år lø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år løbende
und
f%E5r%20l%F8bende
Dann passte alles zusammen - %E5
(Hexadezimal) = å
(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år lø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.:)