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&#229;r l&#248;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?

È stato utile?

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&#229;r l&#248;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&#229;r l&#248;bende e

f%E5r%20l%F8bende

Allora tutto è caduto in posizione - %E5 (esadecimale)= &#229; (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&#229;r l&#248;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.:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top