Rails 导出 CSV 文件 乱码问题

eric_chao · 2018年04月28日 · 2753 次阅读

Guide

这是一篇如何解决 CSV encoding 问题,希望能帮助各位同仁 参考文档 https://stackoverflow.com/questions/155097/microsoft-excel-mangles-diacritics-in-csv-files

导出 CSV 文件结构出现各种乱码,我们需要了解本质 引用 https://blog.csdn.net/evilcry2012/article/details/53112858 CSV 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV 文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。 CSV 文件格式的通用标准并不存在,但是在 RFC 4180 中有基础性的描述。使用的字符编码同样没有被指定,但是 7-bitASCII 是最基本的通用编码。

我们主要关注是纯文本格式的,使用的字符编码没有被指定,所以当我们导出 CSV,用 EXCEL 打开的时候,会出现乱码的原因是

引用 http://blog.163.com/whhlcj@126/blog/static/38702877201455104052915/

为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE 字符开头。这作为一个”特征符”或”字节顺序标记(byte-order mark,BOM)”来识别文件中使用的编码和字节顺序(big-endian 或 little-endian),具体的对应关系见下表。 Bytes Encoding Form 00 00 FE FF UTF-32, big-endian FF FE 00 00 UTF-32, little-endian FE FF UTF-16, big-endian FF FE UTF-16, little-endian EF BB BF UTF-8

为了使我们能够正常打开无编码问题的 CSV 文件,我们需要为 CSV 文件指定 BOM,正常转换识别编码

问题来了?如何在 Rails 里的 CSV 文件操作这点?

很简单,在生成的 CSV 文件头部直接添加 BOM

例如:

csv << ["\xEF\xBB\xBF ID","Name","AGE"] ..

希望能够帮助到大家

eric_chao 关闭了讨论。 04月28日 10:40
eric_chao 重新开启了讨论。 04月28日 10:40
需要 登录 后方可回复, 如果你还没有账号请 注册新账号