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

Ok, j'ai peut être en partie la réponse à ma propre question: à l'aide de 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