POST 数据中的 node.js 和 utf-8
使用 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);
这是一个独立的 Web 服务器,它侦听端口 11180 并发送一个带有简单表单的 HTML 页面,其中包含带有特殊字符的输入字段。将该表单发布到服务器将以纯文本响应形式回显其内容。
我的问题是特殊字符在控制台和浏览器中都没有正确显示。这是我在 FireFox 和 IE 中看到的情况:
POST DATA:
test=Gr%C3%BC%C3%9Fe%21
---
UNESCAPED:
test=GrüÃe!
---
HARDCODED: Grüße!
最后一行是一个硬编码字符串 Grüße!
,它应该与输入字段的值匹配(以验证它不是显示问题)。显然 POST 数据不会被解释为 UTF-8。当使用 require('querystring')
将数据分解为字段时,也会出现同样的问题。
有什么线索吗?
在 Debian Linux 4 上使用 Node.JS v0.4.11,源代码以 utf-8 字符集保存
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
üß UTF-8 字符在 ascii 字符集中找不到,并且由多个 ascii 字符表示。
根据 http://www.w3.org/TR/html4/interact/ forms.html#h-17.13.4.1
将表单上的 enctype 切换为多部分
正如您在评论中提到的,使用
decodeURIComponent()
可能要简单得多。 Unescape 不处理多字节字符,而是将每个字节表示为其自己的字符,因此您会看到乱码。 http://xkr.us/articles/javascript/encode-compare/您还可以使用缓冲区来更改编码。在这种情况下就太过分了,但如果你需要:
The üß UTF-8 characters are not found in the ascii charset, and are being represented by multiple ascii characters.
According to http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
Switching your enctype on the form to multipart
<form method="post" enctype="multipart/form-data />"
will correctly render the text as the UTF-8 characters. You then have to parse the multipart format. node-formidable seems to be the most popular lib for doing so.It's probably much simpler to use
decodeURIComponent()
as you mentioned in a comment. Unescape does not handle multibyte characters, and instead represents each byte as its own character, hence the garbling you're seeing. http://xkr.us/articles/javascript/encode-compare/You can also use buffers to change the encoding. Overkill in this case, but if you needed to: