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字符集中
在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)
| 归档时间: |
|
| 查看次数: |
15834 次 |
| 最近记录: |