Quasar 导出的csv中文乱码
2022-07-11 本文已影响0人
alue
任务:将前端表格导出excel。
前端的表格是Quasar的table组件,官方给出了文件导出的例子。例子是利用 exportFile
函数,将表格数据导出为csv格式的文件。看上去,这完全符合任务需求。但实际运用却发现,导出的中文是乱码。
这肯定是编码的问题,我手动将 encoding
参数设置为"utf-8",结果excel打开这个csv文件,依然乱码。但是用记事本打开,内容都是正常的文本。
同样的文本文件,为什么记事本打开是正常的,但excel打开却是乱码呢?
经过调研,发现这个跟BOM(字节顺序标志,Byte order mark)有关。
BOM的用途
顾名思义,BOM是标志字节顺序的。由于,一个字符可以由多个字节来表示,那么字节顺序就会影响译码(类似大小端)。所以,在文本开头会加入一个BOM,来告诉软件按照怎样的顺序来解码。
了解到这里,就会产生两个疑惑:
- 为什么不强制规定一个字节顺序?给人们这个自由除了带来混乱,还能有什么用?
- 好多单字节就能完成的编码,例如ASCII,还需要BOM吗?因为字节只有1个,就不存在字节顺序的问题。
第一个问题实际上是计算机领域的大小端之争,说白了,大小端都可以,只是没有权威能够号召大家固定二选一,导致采用大小端的软硬件厂商都存在,的确造成了很多混乱。
第二个问题,就是导致我遇到的问题的罪魁祸首。正因为单字节的unicode不需要BOM也能正常解析,好多英文国家的软件只支持ASCII,不用考虑多字节编码的事,所以软件中就不会处理BOM。而excel这类软件支持中文,就需要BOM来告诉它字节顺序。excel会认为csv文件会以BOM开头,而我们生成的文件开头并没有BOM,Excel就会变成乱码。
而记事本并没有认为文件开头一定有dom,所以能够正确解析。
解决办法
前端编码加入BOM即可。
在Quasar的 exportFile
函数中,我们只需要配置参数 byteOrderMark
为 "\uFEFF"即可。