È possibile impostare l'accettazione-chart-charset per il nuovo oggetto FormData (XHR2) o Workaround
-
21-12-2019 - |
Domanda
Ecco il codice di esempio ( 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);
}
.
Quando invii questo vecchio modo tramite il modulo Standart inviare, quindi richiedere il carico utile dell'aspetto:
------WebKitFormBoundary2890GbzEKCmB08rz
Content-Disposition: form-data; name="label"
får løbende
.
Ma quando invii questo modo Ajax, allora sembra poco diverso:
------WebKitFormBoundaryPO2mPRFKj3zsKVM5
Content-Disposition: form-data; name="label"
får løbende
.
Come puoi vedere, in passato il caso è sostituito alcuni caratteri con entità di personaggi,
Ma in caso di utilizzo di FormData
c'è una stringa semplice, che è ovviamente buona perché è UTF-8, ma c'è qualsivoglia possibilità di farlo comportarsi come un modulo di standart inviare?
Soluzione
La risposta alla tua domanda è no . Non puoi cambiarlo. Secondo XMLHTTPRequest2 tr , FormData
I dati costruiti sono esplicitamente codificato a UTF-8
. Senza menzione di consentire di cambiarlo.
Il solito mimetype o il tipo di contenuto-tipo= chart non valido per richieste a più parti, poiché viene gestita in modo diverso per lo stesso motivo.
per citare,
.Se i dati sono un formdata Lasciare che l'organismo di entità richiesta sia il risultato di eseguire l'algoritmo di codifica multipart / modulo-dati con i dati come set di dati modulo e con UTF-8 come esplicita codifica dei caratteri .
Lascia che il tipo di mimo sia la concatenazione dei "dati multipart / formati;", un carattere spaziale U + 0020, "limite=" e la stringa del limite multipart / modulo-dati generato dall'algoritmo di codifica multipart / forma .
Spero che questo aiuti!
Aggiornamento
Se sei disposto a rinunciare
new FormData(document.forms.namedItem("fileinfo"));
per
new FormData().append("name", "value")
Potrebbe esserci una soluzione praticabile possibile. Fammi sapere se questo è quello che stai cercando.
Un altro aggiornamento
ha fatto un po 'di correre. Aggiornato il violino con tutte le modalità
Quindi questa è la storia,
1 form with accept-charset="utf8"
=> comportamento predefinito
Il contenuto non richiede alcuna sfuggente / codifica aggiuntiva. Quindi la richiesta spara con il testo intatto come får løbende
2 form with accept-charset="windows-1251"
=> Il tuo caso
Il contenuto richiede ulteriore scambio / codifica, dal momento che il carbone predefinito del browser qui è UTF8. Quindi il contenuto è sfuggito, e poi licenziato, cioè il contenuto inviato è får løbende
3 FormData constructed with form element
Il contenuto non richiede alcuna sfuggente / codifica aggiuntiva, dal momento che è predefinita di valori predefiniti a utf8
. Quindi la richiesta spara con il testo come får løbende
.
4 FormData constructed, and then appended with escaped data
Il contenuto è ancora nella codifica UTF8, ma non fa male a chiamare escape(content)
prima di aggiungere i dati del modulo. Ciò significa che la richiesta si incende con il testo come f%E5r%20l%F8bende
. Ancora nessun dado giusto?
Ero sbagliato, no. Guardando più vicino [Leggi=> Fissare per alcuni minuti ....] A
får løbende
e
f%E5r%20l%F8bende
Allora tutto è caduto in posizione - %E5
(esadecimale)= å
(decimale). Quindi, in pratica GeneracodictagCodeis, il modo di fare le cose, la codifica basata su escape()
, che non è amichevole HTML.
Allo stesso modo %
, come sappiamo è il modo di codificare HTML. Quindi ho messo un'altra modalità su Ajax, [che è quello che stai cercando, immagino]
5 &#;
Il contenuto è ancora in codifica UTF8. Non fa male sfuggirlo come la codifica HTML, utilizzando questo meraviglioso pezzo di codice da Stackoverflow . E voilà, la richiesta ha sparato con il testo FormData constructed, and then appended with html-escaped data
Aggiornato il violino con tutte le modalità
Spero che questo ti aiuti a liberarlo!
Aggiornamento per Windows-1251 Supporto completo
Questo ingresso får løbende
è stato in mancanza nella modalità precedente 5. Aggiornamento violino http://jsfiddle.net/epssz/ 6 / .
Utilizza una combinazione di soluzione qui https://stackoverflow.com/a/2711936/1304559 e miniera. Quindi il problema è sfuggire a tutto. Quindi ora scappando solo i personaggi non presenti nel charset di Windows-1251.
Questo aiuta a spero!
Altri suggerimenti
Grazie per questa domanda, mi sono divertito!:)
.
Sostituisci
<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="windows-1251">
.
di
<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="utf-8">
.
Il problema è che l'accettazione-charset è windows-1251
anziché utf-8
dopo
oReq.open("POST", "/echo/html", true);
.
Puoi anche aggiungere
oReq.overrideMimeType('text/html; charset=UTF-8');
oReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
.
Ma questo non è ciò che risolve il problema.
Buona fortuna.:)