网站上线后,老师测试了一下导出Excel表格功能,结果发现打开是乱码,其他的小伙伴们表示WPS打开是正常的。
而我们清楚的知道这就是个编码的问题,我快速的想到大概是BOM问题,因为M$的产品就喜欢干这事。
所以我去搜索了一些方案,有个简单粗暴的方案就是直接在文件前面加一个BOM头,然后生成xls文件就可以。
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
gem 'Iconv'
然后只要
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
编码就可以了。
BOM = "\377\376".force_encoding("UTF-16LE")
send_data BOM + Iconv.conv("utf-16le", "utf-8", csv_data)
Done!