学习node时关于http请求中编码情况问题?

基于node搭建服务学习过程中遇到的问题。

有一下三种情况:
通过node的http模块,我们创建一个服务器端口提供网页访问功能:

const server = http.createServer((req, res) => {
    console.log("接受到请求。。。");
    res.setHeader("Content-Type", "text/html;charset=UTF-8");
    url(res, req.url)//自定函数实现的简单路由,内部依靠fs模块实现
})
server.listen(4000)

通过fs,我们将文件(html、css、js等)资源自动转换为字节码

<Buffer 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0d 0a 3c 68 74 6d 6c 20 6c 61 6e 67 3d 22 65 6e 22 3e 0d 0a 0d 0a 3c 68 65 61 64 3e 0d 
0a 20 20 20 20 3c ... 407 more bytes>

然后res.end发送回浏览器,因为http请求头中有编码规范utf8,所以浏览器能处理中文。


但是第二种情况我们发现,不设置http请求头中的utf8编码规范时,html仍然能够编译中文内容,具体原因是因为head标签中的:
<meta charset="UTF-8">

所以提问:

1.html中meta设置charset和node给http请求设置charset区别是啥?

2.浏览器对于这两种编码设置是怎么处理?(我个人猜想:html还是字节码的时候只能识别到http的请求头,但是html编译后执行时又能识别到meta)

3.res.end传参的直接是汉字时会自动转换为字节码吗(因为此时不设置编码浏览器拿到的内容会乱码)?

ps:笔者小白,虽菜勿喷,上述问题皆是实验加思考后总结的问题。

阅读 2.1k
2 个回答

即使你不在header中设置charset
浏览器也会进行 charset detection
chrome的:
https://github.com/google/com...


其次 名词乱用脑壳有点疼
html它就是一段文本,不管它存在内存中,硬盘上,还是正在传输的数据报文中
一般我们所说的字节码指的是 bytecode

服务器传输设置的编码其实是客户端(浏览器)解析时的一个参考,设置和实际html内容编码一致时,浏览器解析会很顺畅,否则可能出现乱码。
如果不设置,其实默认会作为ascii码传,有些在html文档内容中还会有标识,这个浏览器识别到后也能正确解析,否则就可能出现乱码。

需要了解的是,html内容其实本质上就上纯文本信息,它通过标签(组件)才会引入多媒体内容,但这些内容大多数时候是单独的请求去获取的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题