Question

Voici un exemple de code (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);
}

Lorsque je soumet cette ancienne via standart soumettre le formulaire, puis demande de la charge utile ressemble à ceci:

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

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

Mais quand je soumet cette AJAX, alors, il semble peu différent:

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

får løbende

Comme vous pouvez le voir, dans le premier cas il y a quelques caractères est remplacé par les entités de caractères, mais dans le cas de l'utilisation FormData il est de la plaine de la chaîne, ce qui est bon, bien sûr, parce que c'est de l'utf-8, mais est-il une possibilité de le faire se comporter comme standart soumettre ?

Était-ce utile?

La solution

La réponse à votre question est Pas de.Vous ne pouvez pas le changer.Selon XMLHttpRequest2 TR, FormData construit de données est explicitement codé à UTF-8.Sans mention d'permettant de la modifier.

L'habitude type mime ou Content-Type=charset devenir invalide pour une partie multi-requêtes, car il est géré différemment pour exactement la même raison.

Pour citer,

Si les données sont un FormData Laissez la demande du corps de l'entité être le résultat de l'exécution de la multipart/form-data algorithme de codage avec les données de la forme de l'ensemble de données et avec L'UTF-8 comme l'explicite l'encodage des caractères.

Laissez type mime être la concaténation de "multipart/form-data;" U+0020 ESPACE de caractère, "boundary=", et le " multipart/form-data limite chaîne générée par le multipart/form-data algorithme de codage.

Espérons que cette aide!

Mise à jour

Si vous êtes prêt à renoncer à

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

pour

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

il y a peut être une solution viable possible.Permettez-moi de savoir si c'est ce que vous cherchez.

Une Autre Mise À Jour

Fait un peu de courir. Mise à jour de jouer avec tous les modes

C'est donc l'histoire,

1 form with accept-charset="utf8" => comportement par défaut

Le contenu ne nécessite pas d'autres échappement/encodage.Si la demande est déclenché avec le texte intact, får løbende

2 form with accept-charset="windows-1251" => votre cas

Le contenu requiert de s'échapper/encodage, puisque le jeu de caractères par défaut du navigateur ici est utf8.Si le contenu est échappé, et tira ensuite, c'est à direle contenu est f&#229;r l&#248;bende

3 FormData constructed with form element

Le contenu ne nécessite pas d'autres échappement/encodage, car il est par défaut utf8.De sorte que la demande des feux avec texte får løbende.

4 FormData constructed, and then appended with escaped data

Le contenu est toujours dans le codage utf8, mais il ne fait pas de mal à appeler escape(content) avant d'ajouter aux données de formulaire.Cela signifie que la demande des feux avec texte f%E5r%20l%F8bende.Toujours pas de dés à droite?

J'ai eu tort, nope.Regardant de plus près, [lire => fixement pendant quelques minutes....] au

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

f%E5r%20l%F8bende

Puis tout est tombé en place - %E5 (Hexadécimal) = &#229; (Décimal).Donc, fondamentalement, escape()Javascript est-il de la façon de faire les choses, le % en fonction de l'encodage, ce qui n'est pas en HTML sympathique.

De la même façon &#;, comme nous le savons, est de l'HTML façon de coder.J'ai donc mis un autre mode ajax, [qui est ce que vous cherchez, je suppose]

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

Le contenu est toujours en encodage utf8.Ne fait pas de mal de s'échapper comme de codage HTML, à l'aide de ce merveilleux morceau de code à partir de stackoverflow.Et voila, la demande tiré dans le texte f&#229;r l&#248;bende

Mise à jour de jouer avec tous les modes

Espérons que cela aide à le vider!

Mise à JOUR pour windows-1251 plein soutien

Cette привет får løbende l'entrée n'était pas plus tôt dans le mode 5.Mise à jour de violon http://jsfiddle.net/epsSZ/6/.

Utilise une combinaison de la solution ici https://stackoverflow.com/a/2711936/1304559 et la mienne.Le problème est donc de s'échapper à tout.Alors maintenant, s'échapper seuls les caractères qui ne sont pas présentes dans le windows-1251 charset.

Cette aide, j'espère!

Autres conseils

Je vous remercie pour cette question, je me suis fait plaisir!:)
Remplacer

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

par

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

Le problème est le accept-charset est windows-1251 au lieu de utf-8

Après

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

vous pouvez également ajouter

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

mais ce n'est pas ce qui résout le problème.

Bonne chance.:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top