fixmint
ZH

Excel转CSV不乱码:UTF-8、BOM与分隔符设置

作者: · · 阅读约 5 分钟

CSV导出时,大多数乱码都来自编码不一致:文件保存为UTF-8,却被当成Windows编码打开。导出工作表时选择CSV UTF-8;如果接下来用Excel打开,就加上字节顺序标记(BOM),并选用目标环境习惯的分隔符。导出前,把邮政编码、电话号码等列设为文本格式,这样开头的0才能保留。

Excel转CSV需要CSV,手上是Excel文件免费使用

为什么 "é" 会变成 "é"

文件中的字符以字节的形式保存。在UTF-8中,字母é占两个字节,分别是C3和A9。如果程序把这两个字节按Windows-1252读取(这是常见的Windows编码),它会看到C3对应的Ã和A9对应的©。于是"café"就显示成"café"。你可以自己验证:把é按UTF-8编码,再用Windows-1252解码,结果就是é。ü、ñ、ö的情况也一样。

问题不在字符本身,而在于没有告诉程序文件使用的是哪种编码。

UTF-8 与 BOM

UTF-8是网页和大多数现代软件通用的文本编码标准。普通的CSV文件没有字段说明自己使用的编码,所以程序只能猜。字节顺序标记是文件开头的三个字节EF BB BF,会告诉识别它的程序:"这是UTF-8。" 在Windows上,Excel打开没有BOM的UTF-8文件时,常会按本地编码读取,所以加上BOM通常就能解决问题。

较新版本的Excel在"另存为"菜单里提供CSV UTF-8选项,会自动加上BOM。你也可以通过"数据"→"自文本/CSV"导入文件,并把文件原始格式设为65001(UTF-8)。BOM也有一个缺点:不认它的程序可能把它当成第一列列名的一部分。大多数解析器和表格软件都能正确处理,但如果数据导入工具报告表头异常,就把BOM去掉。

逗号还是分号

CSV的意思是逗号分隔值,RFC 4180规范描述的也是用逗号分隔字段。在很多国家,包括使用小数逗号的地区(例如用1,5表示一点五),Excel的列表分隔符是分号。这时,用逗号分隔的文件在Excel里可能拆分错误,1,5这样的数字会被拆成两个字段。

选择目标程序所需的分隔符。Excel转CSV工具提供逗号、分号和制表符三种选项。如果文件要交给使用小数逗号地区的程序,通常分号更稳妥。

日期变成序列号

Excel把日期存为序列号,即从某个起点开始计算的天数。在1900日期系统中,1900年1月1日是序列号1。Excel还把1900年当作闰年,因此会计入一个实际不存在的1900年2月29日,记为序列号60。这使1900年3月1日成了序列号61,之后的每个日期都会往后多算一天。这个错误源于Lotus 1-2-3,微软为了兼容保留了这一系统。其他软件读取1900年3月1日之前的日期时,可能会差一天。

导出时,你可能看到44927而不是2023-01-01,或者老日期差了一天。转换工具会把日期转换成可读文本。如果手动导出,请把日期列设为文本,并采用ISO格式yyyy-mm-dd,所有程序读取的结果都一致。

开头的 0 不见了

邮政编码02134本是文本,但Excel会把输入的数字当作数值处理,于是显示为2134。表格里的0没了,由此写出的CSV也不会有。以0开头的电话号码和长串证件号码也是同样的情况。位数很多的数字还可能丢失末尾数字,因为Excel只保留大约15位有效数字。

解决办法是在输入或导入数据前,把这些列存为文本。如果CSV文件中的0还保留着,请不要直接双击打开,而是用"数据"→"自文本/CSV"导入,并把该列设为"文本"。

引号规则

RFC 4180定义了常见的CSV格式。其主要引号规则如下:

  • 包含逗号、双引号或换行符的字段,必须用双引号括起来。
  • 带引号的字段内,双引号要写成两个双引号。
  • 规范中行尾为CRLF,不过大多数工具也接受LF。

例如,"Müller, Anna","She said ""ok""" 这一行有两个字段:Müller, Anna 和 She said "ok"。IANA登记的CSV MIME类型是text/csv。

RFC 4180不允许未加引号的字段中出现双引号,许多解析器会拒绝这样的行,或错误地拆分它。请正确加上引号,或删除多余的字符。

导出前的检查清单

  1. 导出为CSV UTF-8;如果用Excel打开,请加上BOM。
  2. 选择目标程序所需的分隔符。
  3. 把邮政编码、电话号码等类似编号的列设为文本。
  4. 日期写成yyyy-mm-dd格式。
  5. 用纯文本编辑器打开文件,检查第一行和几个带重音符号的姓名。

不可见字符,例如不间断空格,也会导致导入出错。删除不可见字符工具可以找出并删除它们,文本中的不可见字符解释了它们的来源。文件清理干净后,CSV与JSON互转可以把它转换给开发者使用,具体方法见CSV与JSON互转的方法。

导出前,单元格本身也值得检查:Excel 公式检查工具会列出显示错误或指向其他文件的公式,而这些单元格恰恰会在CSV中变成空白。导出后,可以用对比表格工具比较两个版本之间的变化。

快速解答

为什么我的文件在一个程序里正常,在Excel里却是乱码? UTF-8文件没有BOM时,Windows上的Excel可能会用本地编码读取它。加上BOM,或者导入时选择UTF-8,就能解决。

Mac 版 Excel 需要 BOM 吗? 有些资料说需要,所以发送前请用一个带重音符号姓名的文件测试一下。

导出后还能修正日期吗? 如果日期仍是序列号,可以修正,但最好从一开始就导出为yyyy-mm-dd格式。

转换表格时文件会被上传吗? 工具在浏览器中运行,文件只在你自己的设备上处理。你可以参考上传检测指南进行确认。

由 AI 辅助翻译自英文原文。

评论

    还没有评论。快来抢沙发。

    你的评分(可选)

    你的邮箱不会被显示或保存。

    Open Data for AGI - Why Public, Free, and Open Datasets Matter 的封面Open Data for AGI - Why Public, Free, and Open Datasets Matter

    为什么公开、免费、开放的数据集,与算法和算力一样,将塑造通用人工智能。

    $4.99在 Gumroad 获取英文阅读