Est-il possible de accept-charset pour les nouveaux FormData (XHR2) objet ou une solution de contournement
-
21-12-2019 - |
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år lø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 ?
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år lø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år løbende
et
f%E5r%20l%F8bende
Puis tout est tombé en place - %E5
(Hexadécimal) = å
(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år lø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.:)