node.js et utf-8 dans les données POST
J'ai des problèmes de décodage des chaînes UTF-8 dans le POST de données lors de l'utilisation de la Node.JS serveur web.
Voir cet ensemble de cas de test:
require("http").createServer(function(request, response) {
if (request.method != "POST") {
response.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
response.end('<html>'+
'<head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head>'+
'<body>'+
'<form method="post">'+
'<input name="test" value="Grüße!"><input type="submit">'+
'</form></body></html>');
} else {
console.log("CONTENT TYPE=",request.headers['content-type']);
var body="";
request.on('data', function (data) {
body += data;
});
request.on('end', function () {
console.log("POST BODY=",body);
response.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
response.end("POST DATA:\n"+body+"\n---\nUNESCAPED:\n"+unescape(body)+
"\n---\nHARDCODED: Grüße!");
});
}
}).listen(11180);
Autonome serveur web qui écoute sur le port 11180 et envoie une page HTML avec un formulaire simple qui contient un champ de saisie de caractères spéciaux. Affichage du formulaire au serveur se fera l'écho de son contenu en texte brut réponse.
Mon problème est que la charactes ne s'affichent pas correctement ni la console, ni dans le navigateur. C'est ce que je vois avec IE et FireFox:
POST DATA:
test=Gr%C3%BC%C3%9Fe%21
---
UNESCAPED:
test=GrüÃe!
---
HARDCODED: Grüße!
La dernière ligne est une chaîne codée en dur Grüße!
qui doit correspondre à la valeur du champ de saisie (comme pour vérifier que ce n'est pas un affichage de problème). Évidemment, les données POST n'est pas interprétée comme de l'UTF-8. Le même problème se produit lors de l'utilisation de require('querystring')
à briser les données dans les champs.
La moindre idée?
À l'aide de Node.JS v0.4.11 sur Linux Debian 4, le code source est enregistré en utf-8 charset
decodeURIComponent()
au lieu de unescape()
résout le problème de base. Toutefois, cela signifie que le querytring
Node.JS le module est complètement inutile et je dois faire de l'analyse de moi-même. Ou suis-je mussing quelque chose?OriginalL'auteur Udo G | 2011-10-18
Vous devez vous connecter pour publier un commentaire.
La üß les caractères UTF-8 ne sont pas trouvés dans le jeu de caractères ascii, et sont représentés par plusieurs caractères ascii.
Selon http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
Commutation votre enctype sur la forme de plusieurs parties
<form method="post" enctype="multipart/form-data />"
va afficher correctement le texte que les caractères UTF-8. Ensuite, vous devez analyser le format multipart. nœud-formidable semble être le plus populaire de lib pour le faire.C'est probablement beaucoup plus simple à utiliser
decodeURIComponent()
comme vous l'avez mentionné dans un commentaire. Ne pas encoder ne gère pas les caractères multioctets, et plutôt que représente chaque octet comme son propre caractère, et donc de la rendre méconnaissable que vous vous voyez. http://xkr.us/articles/javascript/encode-compare/Vous pouvez également utiliser des tampons pour changer l'encodage. Overkill dans ce cas, mais si vous avez besoin de:
Je devais m'en tenir à cette réponse sur mon mur.
OriginalL'auteur Ben Taber