大佬教程收集整理的这篇文章主要介绍了node.js – 在请求体中解析UTF8字符的问题?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
var http = require('http'); var server = http.createServer(function(req,res) { var data = ''; req.setEncoding('utf8'); req.on('data',function(chunk) { data += chunk; }); req.on('end',function() { // parse data }); });
假设输入是UTF8编码的,使用req.setEncoding(‘utf8’)会自动将输入字节解码为字符串.但我觉得它可以打破.如果我们收到一个以多字节UTF8字符结尾的数据块怎么办?我们可以模拟这个:
> new Buffer("café") <Buffer 63 61 66 c3 a9> > new Buffer("café").slice(0,4) <Buffer 63 61 66 c3> > new Buffer("café").slice(0,4).toString('utf8') 'caf?'
所以我们得到一个错误的字符,而不是等待下一个字节正确解码最后一个字符.
因此,除非请求对象处理这个问题,确保只将完全解码的字符推入块中,否则这个无处不在的代码示例将被破坏.
另一种方法是使用缓冲区,处理缓冲区大小限制的问题:
var http = require('http'); var MAX_requEST_BODY_SIZE = 16 * 1024 * 1024; var server = http.createServer(function(req,res) { // A better way to do this Could be to start with a small buffer // and grow it geometrically until the limit is reached. var requestBody = new Buffer(MAX_requEST_BODY_SIZE); var requestBodyLength = 0; req.on('data',function(chunk) { if(requestBodyLength + chunk.length >= MAX_requEST_BODY_SIZE) { res.statusCode = 413; // request Entity Too Large return; } chunk.copy(requestBody,requestBodyLength,chunk.length); requestBodyLength += chunk.length; }); req.on('end',function() { if(res.statusCode == 413) { // handle 413 error return; } requestBody = requestBody.toString('utf8',requestBodyLength); // process requestBody as String }); });
我是对的,还是已经由http请求类处理了?
文档虽然没有多大帮助,http://nodejs.org/docs/latest/api/string_decoder.html,但你可以在这里看到模块,https://github.com/joyent/node/blob/master/lib/string_decoder.js
“setEncoding”的实现和发射逻辑也使它更加清晰.
> setEncoding:https://github.com/joyent/node/blob/master/lib/http.js#L270
> _emitData https://github.com/joyent/node/blob/master/lib/http.js#L306
以上是大佬教程为你收集整理的node.js – 在请求体中解析UTF8字符的问题?全部内容,希望文章能够帮你解决node.js – 在请求体中解析UTF8字符的问题?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。