POST数据中的node.js和utf-8

Udo*_*o G 8 post utf-8 node.js

使用Node.JS Web服务器时,我在POST数据中解码UTF-8字符串时遇到问题.

看到这个完整的测试用例:

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);
Run Code Online (Sandbox Code Playgroud)

这是一个独立的Web服务器,它侦听端口11180并发送一个HTML页面,其中包含一个包含带特殊字符的输入字段的简单表单.将该表单发布到服务器将在纯文本响应中回显它的内容.

我的问题是,在控制台和浏览器中都没有正确显示特殊字符.这是我在FireFox和IE中看到的:

POST DATA:
test=Gr%C3%BC%C3%9Fe%21
---
UNESCAPED:
test=GrüÃe!
---
HARDCODED: Grüße!
Run Code Online (Sandbox Code Playgroud)

最后一行是一个硬编码字符串Grüße!,应该与输入字段的值匹配(以确认它不是显示问题).显然,POST数据不会被解释为UTF-8.使用require('querystring')将数据分解为字段时会发生同样的问题.

任何线索?

在Debian Linux 4上使用Node.JS v0.4.11,源代码保存在utf-8字符集中

Ben*_*ber 5

在ascii字符集中找不到üßUTF-8字符,并且由多个ascii字符表示.

根据http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

内容类型"application/x-www-form-urlencoded"对于发送大量二进制数据或包含非ASCII字符的文本效率低下.内容类型"multipart/form-data"应该用于提交包含文件,非ASCII数据和二进制数据的表单.

将表单上的enctype切换为multipart <form method="post" enctype="multipart/form-data />"将正确地将文本呈现为UTF-8字符.然后,您必须解析多部分格式. node-formidable似乎是最受欢迎的lib.

decodeURIComponent()正如您在评论中提到的那样使用它可能要简单得多.Unescape不处理多字节字符,而是将每个字节表示为自己的字符,因此您看到的是垃圾. http://xkr.us/articles/javascript/encode-compare/

您还可以使用缓冲区来更改编码.在这种情况下矫枉过正,但如果您需要:

new Buffer(myString, 'ascii').toString('utf8');
Run Code Online (Sandbox Code Playgroud)