背景
前端下載文件,下載為csv格式牵啦,Excel打開(kāi)亂碼的問(wèn)題亚情。
前端下載代碼很簡(jiǎn)單,利用HTML5的blob接口生成前端下載鏈接哈雏,實(shí)現(xiàn)下載楞件。
那問(wèn)題出在哪里呢?讀入的文件是utf-8格式裳瘪,下載下來(lái)Excel打開(kāi)亂碼土浸,但是用其他編輯器打開(kāi)并不是亂碼,一開(kāi)始解決問(wèn)題的思路是彭羹,下載文件的時(shí)候黄伊,是不是沒(méi)有指定編碼方式,導(dǎo)致文件編碼方式不對(duì)皆怕,于是乎使用了Blob里的type參數(shù)毅舆,硬塞了一個(gè)類型以及編碼方式,但是這種方法似乎并不管用愈腾,仔細(xì)讀了官方文檔之后憋活,關(guān)于type的解讀如下:
type,默認(rèn)值為 ""虱黄,它代表了將會(huì)被放入到blob中的數(shù)組內(nèi)容的MIME類型悦即。
這里明確表明,此type只是一個(gè)類型標(biāo)記,并不會(huì)起到轉(zhuǎn)碼的作用辜梳,想想也是粱甫,blob僅僅是內(nèi)存里開(kāi)辟的0,1代碼作瞄,怎么可能在下載的過(guò)程中去解碼編碼呢茶宵?
后來(lái)逛遍大谷歌,發(fā)現(xiàn)這其實(shí)是微軟家的坑宗挥,微軟家發(fā)明了一個(gè)東西叫bom頭乌庶,關(guān)于bom頭:
這個(gè)惡心的bom頭,微軟系產(chǎn)品類似Excel會(huì)先識(shí)別該bom頭契耿,然后才能認(rèn)識(shí)你瞒大,而針對(duì)csv格式文件,Excel又格外不友好搪桂。一些列手把手指導(dǎo)如何使用Excel打開(kāi)透敌,導(dǎo)入,導(dǎo)出csv格式文件的文章網(wǎng)上一大堆踢械,那這里酗电,我們的解決方法是給你加一個(gè)你認(rèn)識(shí)的bom頭,那你總能識(shí)別了吧裸燎。
解決方法
因此我們通過(guò)blob新建下載url的時(shí)候顾瞻,加一個(gè)bom頭編碼:
window.URL.createObjectURL(new Blob(['\uFEFF' + content]))
再無(wú)亂碼!
參考
https://stackoverflow.com/questions/18925210/download-blob-content-using-specified-charset
https://stackoverflow.com/questions/38508064/url-createobjecturl-and-charset-utf-8