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

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

看到这个完整的testing用例:

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); 

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

我的问题是,在控制台和浏览器上都没有正确显示特殊字符。 这就是我看到的火狐和IE浏览器:

 POST DATA: test=Gr%C3%BC%C3%9Fe%21 --- UNESCAPED: test=GrüÃe! --- HARDCODED: Grüße! 

最后一行是一个硬编码的stringGrüße! 这应该匹配input字段的值(以validation它不是一个显示问题)。 POST数据显然不被解释为UTF-8。 使用require('querystring')将数据分解为字段时会发生同样的问题。

任何线索?

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

在ASCII字符集中找不到üßUTF-8字符,并用多个ASCII字符表示。

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

内容types“application / x-www-form-urlencoded”对于发送大量的包含非ASCII字符的二进制数据或文本是不够的 。 内容types“multipart / form-data”应该用于提交包含文件,非ASCII数据和二进制数据的表单。

将表单上的enctype切换为多部分<form method="post" enctype="multipart/form-data />"将正确地将文本呈现为UTF-8字符。 然后你必须parsing多部分格式。 节点强大似乎是这样做的最受欢迎的库。

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

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

 new Buffer(myString, 'ascii').toString('utf8');