UTF-8 CSV文件是否应包含BOM(字节顺序标记)?


37

我们的业务线软件允许用户将某些数据保存为CSV。由于野外使用了许多不同的格式(都称为“ CSV”),因此我们试图确定“默认格式”应是什么样。

  • 关于行/字段分隔符和转义,我们可以使用一个标准:RFC 4180

  • 关于文本编码,UTF-8似乎在过去十年中以“默认文本文件格式”出现,因此我们将使用它。

一个悬而未决的问题是:我们是否应该在开始时添加BOM?我已经阅读了有关BOM总体使用的多种观点和优缺点,但是对于在CSV文件中使用BOM而言,是否存在“正式”建议或至少某种形式的社区共识?


7
如果它具有BOM表,则它不是UTF-8。但是程序想要什么格式。如果他们需要一个BOM(主要是微型工具),则需要添加一个,但UTF-8 + BOM≠UTF-8。
ctrl-alt-delor

3
尽管CSV显然更易于生成,但是仍然存在许多兼容性问题,尤其是如果您偏离了纯7位ASCII,我强烈建议您生成实际的XLSX(如果目标是用户打开它)在Excel中(而不是在其他软件中重新导入它,在这种情况下,您将必须提供分隔符,编码等选项)。那里有大多数语言的库,您将为您和您的用户节省大量时间。
jcaron

2
如果您确实采用CSV路由,请检查同时在Mac和PC上打开文件时会发生什么情况,最好是使用多个版本的Excel。另请注意,双击文件以将其打开或通过菜单打开文件时,某些版本的Excel行为不同。
jcaron

2
如果它在Excel中正确打开,为什么有关系?问题中没有任何内容表明Excel需要能够解析生成的文件...
rubenvb

Answers:


55

不是针对UTF-8,而是请参见注释中的各种注意事项。

与UTF-16 / 32不同,这是不必要的(UTF-8没有字节顺序),并且在Unicode标准中不建议这样做。很少会看到UTF-8带有BOM的情况,因此这种情况也非常罕见,因此,除非您有正当的理由(例如,如所评论的那样,否则您将使用需要BOM的软件),我建议使用无BOM的方法。

Wikipedia提到主要是一些Microsoft软件,这些软件强制使用并需要BOM,但是除非您与之合作,否则请不要使用它。


28
也有广泛的软件需要BOM:Excel需要BOM才能将CSV文件正确标识为UTF-8,而不是“ ANSI”(即本地兼容性语言环境)。(但是Excel 在保存这样的文件时也会做一些奇怪的事情,因此,如果用户要使用Excel打开文件,我们建议用户使用“真实的” Excel导出而不是CSV导出。)
Heinzi

21
@Heinzi我很久以前就了解到,使用CSV和Excel不能真正赢。这只是一个糟糕的CSV阅读器。太糟糕了,这是普通用户所期望的。
配管

9
@Voo:要求UTF-8的BOM是违反标准的,因为它既“ 既不是必需的也不是推荐的 ”。
重复数据删除器

12
@Deduplicator:MS-DOS和Windows系统具有大量的UTF-8以外的编码格式的旧文本文件。质量应用程序允许用户指定打开文本文件时的编码方式,但通常包括“自动”选项。如果用户选择“ UTF-8”,则无论是否带BOM,UTF-8文件都会正确打开。如果用户选择“自动”,则某些没有BOM的UTF-8文件可能会误认为使用其他编码。我不确定应用程序会做些什么,因为“被错误识别”的文件可能与...完全相同...
supercat

7
@Voo:这与BOM非法的许多其他特定于格式的要求相冲突。例如,带BOM的Shell脚本#!无效。充其量,UTF-8中的BOM是“允许的,没有特定于格式/应用程序的要求”,而不是“允许”,因此不应使用。这些标准实际上是关于“不应该”的。
R.,

8

尽管肯定会普遍接受UTF-8,但仍没有广泛的AFAIK约定。

BOM是一个可怕的工件:

它是不可见的(零宽度空间)。

某些软件可能会中断第一列名称,该名称不仅包含字母,而且还包含前面的奇怪BOM。

标头行可能会被复制以破坏第一个值的值行。

只有某些Windows软件才需要使用它来区分该本地Windows计算机使用的ANSI编码之一和UTF-8。记事本,Excel。

所以可悲的是,应该支持BOM。也许是可选的。

对文件使用命名方案(...- utf8.txt,...- utf8bom.txt)。


在许多情况下,我们可以使用HTML作为导出替代方案。这允许在文件中设置编码。一个额外的功能是行和单元格的背景/前景着色。这提高了出口质量。


15
格式化是否“提高导出质量”在很大程度上取决于文件的预期用途。CSV通常用作一种简单的机器可读格式,在这种情况下,使收件人解析HTML将会是一个很大的缺点
IMSoP

5
如果您选择命名方案,请紧记受众。-utf8-windows.csv更好。在计算机环境中,几乎每个人都知道Windows是什么,但很少有人知道字节顺序标记是什么。
MSalters

2
@Davislor是的,如果它是广泛传播的已知标准。否则,错误报告将tschüß成为垃圾,而tschüß应该将其写入。在StackOverflow上,许多IT错误与编码有关。最终用户也会遇到问题。
Joop Eggen

3
@JoopEggen在哪个社区中的“广泛传播的已知标准”到底是什么?我一直在做软件开发近10年来,我从来没有看到-甚至在Windows上,并肯定不能在Linux或OSX,你几乎总是处理UTF-8。
立方

1
@JustinTime是的,甚至几年以来都是这样,但之前没有。MS开发人员还不错(符合Posix,现在支持UTF-8)。
乔普·艾肯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.