Node 中文編碼 我爲何哭了

最近在作一個先後端分離的項目,服務端是用 Node 寫的。需求大概是這樣的:在前端界面點擊按鈕,觸發下載一份文件到本地,須要特別提到的是文件中包含中文字符串。前端

一看這需求,心想這還不 easy 嗎?暗戳戳地寫了個接口,download 就實現了。打開文件一看,wtf,中文怎麼都亂碼了!!!後端

不能忍,回想這一整個流程,彷佛並無對字符編碼進行處理,隱隱發現出現問題的地方了。因而,在流程的每一個涉及到字符編碼的地方,都強行用 utf-8 去處理。bash

讀文件流:前後端分離

let input = fs.createReadStream(path)
input.setEncoding('utf8')
複製代碼

設置 Content-Type:ui

res.setHeader('Content-Type', 'text/plain;charset = utf-8')
複製代碼

設置輸出流:編碼

res.write(data, 'utf8')
複製代碼

這一套組合拳打出來之後效果立竿見影,下載的文件中文都能正常顯示了。spa

拉到文件底部,咦,文件怎麼被截斷了,還有一些內容不見了,跑去哪了啊。code

回來又定睛一看,可能 Content-Length 出了問題。果不其然,上面的 data 是咱們輸出的字符串,我用 data.length 來獲取它的長度,中文都被當成一個字節處理了。然而中文多是三四個字節呀!正確的計算長度須要用 Buffer 類來獲取。cdn

res.setHeader('Content-Length', Buffer.byteLength(data))
複製代碼

啊,好煩。我這麼帥,爲何要吃 Node 的苦。接口

祝你們 520 快樂💗!

相關文章
相關標籤/搜索