网站上线后,老师测试了一下导出Excel表格功能,结果发现打开是乱码,其他的小伙伴们表示WPS打开是正常的。

而我们清楚的知道这就是个编码的问题,我快速的想到大概是BOM问题,因为M$的产品就喜欢干这事。

所以我去搜索了一些方案,有个简单粗暴的方案就是直接在文件前面加一个BOM头,然后生成xls文件就可以。

1
csv_data = "\xEF\xBB\xBF" + csv_data

我试了一下,是真的,很厉害。

那我就没必要说它坑了。

用了如上方法后,在Excel中打开该文件的确不乱码了,但是格式出现错误,就是该分行分列的都乱了。
所以继续寻找方案。

搜到最多的就是说改成UTF-16LE编码,我本身是不喜欢这么干的,因为我脑子里一直觉得UTF-8大法是应该统治地球的。
尝试UTF-8格式的各种调试后,我终于屈服了。

最后还是决定使用UTF-16LE, 因为格式总是错误,而且很多人的建议是Forget UTF-8 and use UTF-16LE
所以要使用Iconv来实现编码转换,在Gemfile中添加这个gem

1
gem 'Iconv'

然后只要

1
2
3
BOM = "\377\376"
# 这里要使用UTF16的BOM,和UTF-8不同
send_data BOM + Iconv.conv("utf-16le", "utf-8", csv_data)

好吧这里又踩一个坑,会报错

incompatible character encodings: UTF-8 and UTF-16LE

因为我的源代码文件全是UTF-8,所以BOM是UTF-8编码的,和已经转换成UTF-16LE的csv_data不能相加。
所以把BOM也改成UTF-16LE编码就可以了。

1
2
BOM = "\377\376".force_encoding("UTF-16LE")
send_data BOM + Iconv.conv("utf-16le", "utf-8", csv_data)

Done!

如有疏漏,欢迎评论指出,或者前往Github提出issue~谢谢