Node 中文编码 我为什么哭了

最近在做一个前后端分离的项目,服务端是用 Node 写的。需求大概是这样的:在前端界面点击按钮,触发下载一份文件到本地,需要特别提到的是文件中包含中文字符串。

一看这需求,心想这还不 easy 吗?暗戳戳地写了个接口,download 就实现了。打开文件一看,wtf,中文怎么都乱码了!!!

不能忍,回想这一整个流程,似乎并没有对字符编码进行处理,隐隐发现出现问题的地方了。于是,在流程的每个涉及到字符编码的地方,都强行用 utf-8 去处理。

读文件流:

let input = fs.createReadStream(path)
input.setEncoding('utf8')
复制代码

设置 Content-Type:

res.setHeader('Content-Type', 'text/plain;charset = utf-8')
复制代码

设置输出流:

res.write(data, 'utf8')
复制代码

这一套组合拳打出来以后效果立竿见影,下载的文件中文都能正常显示了。

拉到文件底部,咦,文件怎么被截断了,还有一些内容不见了,跑去哪了啊。

回来又定睛一看,可能 Content-Length 出了问题。果不其然,上面的 data 是我们输出的字符串,我用 data.length 来获取它的长度,中文都被当成一个字节处理了。然而中文可能是三四个字节呀!正确的计算长度需要用 Buffer 类来获取。

res.setHeader('Content-Length', Buffer.byteLength(data))
复制代码

啊,好烦。我这么帅,为什么要吃 Node 的苦。

祝大家 520 快乐?!

转载于:https://juejin.im/post/5ce21e34e51d45106343178e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值