微软 Office 是不少人文书处理必备的程式,深获不少人喜爱。但一旦用其他文书软件开启微软 Office 的文件档案 OOXML,却常会出现问题,导致版面乱掉。日前文件基金会(The Document Foundation,缩写 TDF)暨 LibreOffice 的创办人 Italo Vignoli 访台,在 COSCUP2017 开源人年会上开讲,其后又假摩兹工寮发表专题演说,其中披露了许多鲜为人知的 OOXML 秘辛。
笔者先前在《Office 软件到底该用哪个?各家格式标准为何?》该文粗浅提过办公文件交换性与可阅读性的课题,就像过去文房四宝跟纸张并无绑定厂牌,好的数位文件档案格式也应该是如此。更进一步地,Italo Vignoli 在会中提到“interoperability”互用性的重要。
良好互用性降低资讯交换成本
“interoperability”这个英文字拆解开来是 inter、operate、ability 的组合,意思是互用性或“互操作性”。旧时代可能认为文件印出来或简报过一次就没事了,印出纸本的原始档案格式是啥没关系;然而现在数位文件不只是一次性的“工作档”功能,更有网络流传与共同作业的需要。也就是说不单单只是笔者前文提到的交换性(exchange),更重要的是交换后,两方要都要能无碍阅读、可进行作业,才称得上有互用性,良好的互用性就是更能一起工作,降低双方成本。 一个互用性良好的档案格式标准,可让任何软件都能正确使用(例如 wav、jpg、png、pdf 等,用哪个程式打开,呈现出来都一样)。
(Source:Italo Vignoli CC BY 4.0)
互用性的基石有赖真正的开放文件标准、使用自由字形、跨平台软件,文件标准的重要性不言而喻。ODF 科技委员会 (ODF Technical Committee ) 比较 ODF 与 Microsoft 公司的 OOXML 时,会发现 OOXML 不具备真正符合“标准”意含的东西,其最关键的,是真正的标准不该对过去非标准的东西有相容性。
假想这种状况。你买了电器要把插头插到插座,如果发现得面对同一标准下,竟然包含了两孔(平头)、三孔(平头)、两孔(圆头),电压 220V、110V、100V 等不同规格,插头即便可以插进去,却还如履薄冰,操心电压是否不同而产生危险,这种东西肯定不会叫标准。一个真正的新标准就是要割舍过去各种庞杂的规格而只使用一种,就像秦始皇施行书同文、车同轨政策,如果为了相容性把一堆不同轨距的轨道通通纳入新标准继续使用,这种“标准”称不上标准。
▲ 远古时代书写不统一,同一件公告要用三种写法各刻一遍。(Source:Italo Vignoli CC BY 4.0)
剖开 OOXML 档
让我们来实际看看 OOXML 的实际状况。首先一个标准多半会以其他标准为基石,OOXML 也不例外,它采用了 Dublin Core 图书原始资料国际标准,ODF 也是。然而,OOXML 只有使用这个,而 ODT 还采用了 XLS:FO、SVG、MathML、XLink、SMIL、XForms 等开放标准。那啥是 Dublin Core 呢?就是记载一份文件的标题、创建者、主题、描述、发行者、日期、类型、格式、语言、权限等资讯,所以你可以发现 OOXML 的表格、排版样规、图片、数学描述式、超链接等等都跟现今通用标准大不同。跟当前标准不同的还有语言代码,ISO639 国际标准是语言名缩写的标准,例如 English=EN、华语是 ZH 等,然而 OOXML 却有自己特有的编号,跟 ISO639 不互通,这导致 OOXML 会跟照 ISO639 标准制作的软件有冲突。
更进一步我们来看颜色好了。在 ODF 里面,不管是试算表、文件、简报等等,红色的代码都是 #FF0000,然而 OOXML 呢?
- Word:#FF0000
- Excel:#FFFF0000
- Powerpoint:#FF0000
竟然自家都不统一,甚至更夸张的是,颜色的色码定义也都非标准,反而 SVG 傻傻地照标准色码来实做。
(Source:Italo Vignoli CC BY 4.0)
这意味着如果你要写一个 script 来批次改一大堆 OOXML 档案,或者说要做大量分析(比如公文处理状况统计),你会遇到很多麻烦。
我们接下去看。身为一个标准,正确性自然要有相当的讲究,然而在月历部分,OOXML 的规格却有闰年虫的错误。如果你的祖父生于 1900 年 3 月 1 日,OOXML 会把他的生日变到 2 月 29 日去。更进一步,OOXML 也不管其他历法,例如犹太历、回教历,甚至东亚的农历,只考虑西历,这也就算了,更糟糕的是,OOXML 不会管操作系统的地区设定,Networkdays () 函式永远把周六、周日当成一周的最后两天,然而犹太人、越南人、葡萄牙人、日本人、英国人等把周日当一周中的第一天,埃及人把周六当成一周的第一天。这导致很多问题,尤其对以色列与泛阿拉伯国家的使用者非常困扰,对于虔诚的基督徒、天主教徒来说,主日变成 7 天的末日也难以接受吧?
▲ 闰年虫问题。(Source:Italo Vignoli CC BY 4.0)
再来看图像问题,ISO / IEC 8632 是电脑图像原始档案标准(cgm),是描述一张图片的原始档(metafile),里面可能含有向量图、位图与纯文字,当办公文件档里面要嵌入一张图片时,需要附有一个 metadata 档,然而 OOXML 却是推荐自家 Windows Metafiles or Enhanced Metafiles 而不是 ISO / IEC 8632 或 W3C 标准的 SVG,这是在公开标准里暗藏私家规格,这有如你买了一包标准 A4 影印纸,却发现只有特定牌子的墨水才能打印一样荒谬。说到开放向量图档方面又有冲突了,ODF 采用 W3C 标准的 SVG,这是当今网络向量图档标准,以 XML 描述绘图指令或嵌入位图 ;而 OOXML 的 DrawingML 则是定义出 VML 这个不相容于 SVG 的规格,该规格在 1998 年提交给 W3C 后从未被赞同,甚至 Microsoft 自家浏览器在 IE 10 时也弃用,只剩下 OOXML 在用。
同样类似的,MathML 不但是 W3C 描述数学式的标准,还是 ISO / IEC 26300 的标准(后来的 ODF),后起的 OOXML 的 Math 格式则故意做跟 W3C 的 MathML 有冲突且不互通。
把他们的语言弄乱,使他们彼此不能沟通
更深入地剥开档案格式的面纱,说到档案格式,就会有复杂度的问题,不管是 ODF 或 OOXML 的档案,核心都是 XML 档,XML 的特色就是透明,人类可以方便阅读的档案,跟 XML 档相对的是二进制格式档案,二进制储存的资料虽然档案小,但只有机器看得懂人类看不懂。乍看之下,ODF 与 OOXML 核心都是 XML 档应该差不多吧?其实不然。Vignoli 把同一篇文章输入 LibreOffice 与 MS Office,使用一模一样的编排,交叉存成 ODF 或 OOXML 格式,有惊人的发现。
读者可以自己做实验,ODF 的 odt、odp、ods 等以及 OOXML 的 docx 、pptx 、xlsx 等,都是 zip 档,解压缩以后可以看到其 xml 档。
▲ 同样用这篇文章输入。(Source:Italo Vignoli CC BY 4.0)
▲ 会得到相差悬殊的行数与档案大小。(Source:Italo Vignoli CC BY 4.0)
这边可以发现不管用那一个软件,输出的 ODF 档都小非常多,其次,单看档案格式,OOXML 会有爆量的行数。ODF 两百多行就描述清楚的东西,OOXML 要大到一万多行!这究竟是为何?此外不管 OOXML 或 ODF,只要是 MS Office 存的,一定都会比较大,MacOS 版 MS Office 存出来尤其巨大。
用更简单的测试方法,例如一个文件档里面只有“To be, or not to be, this is the question.”的内容测试文书软件,odt 里面会是类似这样的内容(为方便阅读理解有简化过)。
(Source:Italo Vignoli CC BY 4.0)
docx 里面则是如此的内容。
▲ 先垂直再水平看。(Source:Italo Vignoli CC BY 4.0)
是的,docx 的基本资料单位不是段落,而是“一个字加一个空白”,这可能是 MS Office 编排定位精准的秘密,然而你可能要傻眼了,如果要写一个软件来剖析大量的 docx 档,收集大数据资料时(例如政府开放资料、公文等),你应该会写到撞墙;不写软件也罢,只是阅读可以吧?然而我们人类要读的话非常困难,这完全违反了 XML 的设计精神──透明的人类可读性,哪天核弹攻击把世界所有软件公司都摧毁了,仅存的人类还是可以看懂一个良好的 XML 档,写出呈现的软件。
下面笔者再放上实际测试文章的结果,odt 可以快速找到文章本文在哪里,而 docx 则把本文拆得支离破碎。
▲ XML of ODT(LibreOffice)。
▲ 为了美观,背后做了非常没有效率的事情。图为 XML of DOCX(MS Office 2016)。(Source:Italo Vignoli CC BY 4.0)
除此之外,Vignoli 还做了很多测试,发现 MS Office不管是存 OOXML 甚至存 ODF 时,还会偷偷塞不明的东西甚至是二进制格式内容(ODF 只有内嵌外部图片与物件才用二进制格式),或把 ODF 本来设计的良好阅读格式也弄得支离破碎(留意看“Suspendisse at mauris eget”开始的段落 ),人类难以阅读,也对第三方软件的判读造成困扰。
▲ ODF 本来良好的内文段落被拆散。图为 XML of ODT(MS Office 2013)。(Source:Italo Vignoli CC BY 4.0)
OOXML 为何有这样藏起来的巨大复杂度?有两个原因,首先,当初审议 OpenXML 的 ECMA 国际组织就表示过,从一开始 OOXML 的设计就是忠实地把 Microsoft 公司私家定义的 doc、ppt、xls 二进制格式转成 XML 格式,这表示并没有依照 XML 的特性最佳化,而其私有格式内含的额外非标准元件也含在内,例如 ActiveX 等等(过时,且容易用来攻击);第二个原因是 Bill Gates 在 1998 年留下的备忘录,提到“不能让其他浏览器可完美呈现 MS Office 文件,只能让自家公司专属 IE 可正确呈现”(虽然现在 IE 已中止发展),现在的状况可以说 Microsoft 延续 Gates 的精神,使“现代的 MS Office 存出的 OOXML 档”刻意做成第三方软件不好完善地解读、呈现,而这显现 OOXML 号称开放标准的荒谬。
▲ 摘自 PX02991.pdf。
也就是说 Microsoft 为了企业利益,不惜制造“巴别塔”,办公文件越是混乱不互通(包含不同代 MS Office 存出的 OOXML 档),越是有利于 Microsoft 公司,可是这样不互通、格式不稳定不利于消费者,巴别塔就意谓著巨大的资讯交换成本。但这都什么时代了,大家上网用不同的浏览器读一样的 html5 页面,用不同的影片软件看蓝光、DVD、mp4 ;不同的播放器放 aac、ogg、mp3;用不同的软硬件修图,制作 png、jpg 等;用不同的软件制作 epub、pdf,为什么独独办公文件软件就要被搞成巴别塔?
安全性
档案内越是有巨大且隐匿的复杂度,就越难找到其中有问题的代码,也就是说就越容易被骇客暗藏攻击。
(Source:Italo Vignoli CC BY 4.0)
从 2011 年 Symantec 公司的统计资料可以看到,Office 档案的病毒破坏案例之多,某些时候甚至多于执行档病毒,Office 档案里除了真正的文件资料,还有很多冗余扰乱第三方软件解读的代码,病毒就可以藏在这温床中,不易追查到。试想,除了可执行档以外,各种资料档案格式中,长期以来为什么就是 MS Office 的档案最会中毒呢?(虽然 PDF 也不遑多让,但其漏洞是因为可以夹藏档案,包含有毒 docx 档)是否这样庞杂的档案格式促成了病毒制造者与防毒公司的双赢?
最后我们可以发现要作 open data 用或要广为传布的文件时,OOXML 真的有太多互通性、安全性、可检阅性的疑虑,所以采用一个标准必须非常审慎。
- PX02991.pdf
- OFFICE OPEN XML OVERVIEW
(首图来源:pixabay)
延伸阅读:
- Office 软件到底该用哪个?各家格式标准为何?