美文网首页Ruby
Roo使用UTF-8编码生成的csv/xls乱码问题

Roo使用UTF-8编码生成的csv/xls乱码问题

作者: pujiaxun | 来源:发表于2016-07-31 10:09 被阅读75次

    网站上线后,老师测试了一下导出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!

    相关文章

      网友评论

        本文标题:Roo使用UTF-8编码生成的csv/xls乱码问题

        本文链接:https://www.haomeiwen.com/subject/doitsttx.html