主页 > 每日动力 >微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

2020-07-09 246浏览量
微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

微软 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 等,用哪个程式打开,呈现出来都一样)。

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

互用性的基石有赖真正的开放文件标準、使用自由字形、跨平台软体,文件标準的重要性不言而喻。ODF 科技委员会 (ODF Technical Committee ) 比较 ODF 与 Microsoft 公司的 OOXML 时,会发现 OOXML 不具备真正符合「标準」意含的东西,其最关键的,是真正的标準不该对过去非标準的东西有相容性。

假想这种状况。你买了电器要把插头插到插座,如果发现得面对同一标準下,竟然包含了两孔(平头)、三孔(平头)、两孔(圆头),电压 220V、110V、100V 等不同规格,插头即便可以插进去,却还如履薄冰,操心电压是否不同而产生危险,这种东西肯定不会叫标準。一个真正的新标準就是要割捨过去各种庞杂的规格而只使用一种,就像秦始皇施行书同文、车同轨政策,如果为了相容性把一堆不同轨距的轨道通通纳入新标準继续使用,这种「标準」称不上标準。

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

 远古时代书写不统一,同一件公告要用三种写法各刻一遍。

剖开 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 呢?

竟然自家都不统一,甚至更夸张的是,颜色的色码定义也都非标準,反而 SVG 傻傻地照标準色码来实做。

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

这意味着如果你要写一个 script 来批次改一大堆 OOXML 档案,或者说要做大量分析(比如公文处理状况统计),你会遇到很多麻烦。

我们接下去看。身为一个标準,正确性自然要有相当的讲究,然而在月曆部分,OOXML 的规格却有闰年虫的错误。如果你的祖父生于 1900 年 3 月 1 日,OOXML 会把他的生日变到 2 月 29 日去。更进一步,OOXML 也不管其他曆法,例如犹太曆、回教曆,甚至东亚的农曆,只考虑西曆,这也就算了,更糟糕的是,OOXML 不会管作业系统的地区设定,Networkdays () 函式永远把週六、週日当成一週的最后两天,然而犹太人、越南人、葡萄牙人、日本人、英国人等把週日当一週中的第一天,埃及人把週六当成一週的第一天。这导致很多问题,尤其对以色列与泛阿拉伯国家的使用者非常困扰,对于虔诚的基督徒、天主教徒来说,主日变成 7 天的末日也难以接受吧?

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

 闰年虫问题。

再来看图像问题,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 档。

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

 同样用这篇文章输入。

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

 会得到相差悬殊的行数与档案大小。

这边可以发现不管用那一个软体,输出的 ODF 档都小非常多,其次,单看档案格式,OOXML 会有爆量的行数。ODF 两百多行就描述清楚的东西,OOXML 要大到一万多行!这究竟是为何?此外不管 OOXML 或 ODF,只要是 MS Office 存的,一定都会比较大,MacOS 版 MS Office 存出来尤其巨大。

用更简单的测试方法,例如一个文件档里面只有「To be, or not to be, this is the question.」的内容测试文书软体,odt 里面会是类似这样的内容(为方便阅读理解有简化过)。

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

docx 里面则是如此的内容。

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

 先垂直再水平看。

是的,docx 的基本资料单位不是段落,而是「一个字加一个空白」,这可能是 MS Office 编排定位精準的祕密,然而你可能要傻眼了,如果要写一个软体来剖析大量的 docx 档,收集大数据资料时(例如政府开放资料、公文等),你应该会写到撞墙;不写软体也罢,只是阅读可以吧?然而我们人类要读的话非常困难,这完全违反了 XML 的设计精神──透明的人类可读性,哪天核弹攻击把世界所有软体公司都摧毁了,仅存的人类还是可以看懂一个良好的 XML 档,写出呈现的软体。

下面笔者再放上实际测试文章的结果,odt 可以快速找到文章本文在哪里,而 docx 则把本文拆得支离破碎。

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

 XML of ODT(LibreOffice)。

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

为了美观,背后做了非常没有效率的事情。图为 XML of DOCX(MS Office 2016)。

除此之外,Vignoli 还做了很多测试,发现 MS Office不管是存 OOXML 甚至存 ODF 时,还会偷偷塞不明的东西甚至是二进位格式内容(ODF 只有内嵌外部图片与物件才用二进位格式),或把 ODF 本来设计的良好阅读格式也弄得支离破碎(留意看「Suspendisse at mauris eget」开始的段落 ),人类难以阅读,也对第三方软体的判读造成困扰。

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

ODF 本来良好的内文段落被拆散。图为 XML of ODT(MS Office 2013)。

OOXML 为何有这样藏起来的巨大複杂度?有两个原因,首先,当初审议 OpenXML 的 ECMA 国际组织就表示过,从一开始 OOXML 的设计就是忠实地把 Microsoft 公司私家定义的 doc、ppt、xls 二进制格式转成 XML 格式,这表示并没有依照 XML 的特性最佳化,而其私有格式内含的额外非标準元件也含在内,例如 ActiveX 等等(过时,且容易用来攻击);第二个原因是 Bill Gates 在 1998 年留下的备忘录,提到「不能让其他浏览器可完美呈现 MS Office 文件,只能让自家公司专属 IE 可正确呈现」(虽然现在 IE 已中止发展),现在的状况可以说 Microsoft 延续 Gates 的精神,使「现代的 MS Office 存出的 OOXML 档」刻意做成第三方软体不好完善地解读、呈现,而这显现 OOXML 号称开放标準的荒谬。

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

 摘自 PX02991.pdf。

也就是说 Microsoft 为了企业利益,不惜製造「巴别塔」,办公文件越是混乱不互通(包含不同代 MS Office 存出的 OOXML 档),越是有利于 Microsoft 公司,可是这样不互通、格式不稳定不利于消费者,巴别塔就意谓着巨大的资讯交换成本。但这都什幺时代了,大家上网用不同的浏览器读一样的 html5 页面,用不同的影片软体看蓝光、DVD、mp4 ;不同的播放器放 aac、ogg、mp3;用不同的软硬体修图,製作 png、jpg 等;用不同的软体製作 epub、pdf,为什幺独独办公文件软体就要被搞成巴别塔?

安全性

档案内越是有巨大且隐匿的複杂度,就越难找到其中有问题的代码,也就是说就越容易被骇客暗藏攻击。

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

微软文书格式为何常跑掉?揭开 OOXML 格式大祕辛

从 2011 年 Symantec 公司的统计资料可以看到,Office 档案的病毒破坏案例之多,某些时候甚至多于执行档病毒,Office 档案里除了真正的文件资料,还有很多冗余扰乱第三方软体解读的代码,病毒就可以藏在这温床中,不易追查到。试想,除了可执行档以外,各种资料档案格式中,长期以来为什幺就是 MS Office 的档案最会中毒呢?(虽然 PDF 也不遑多让,但其漏洞是因为可以夹藏档案,包含有毒 docx 档)是否这样庞杂的档案格式促成了病毒製造者与防毒公司的双赢?

最后我们可以发现要作 open data 用或要广为传布的文件时,OOXML 真的有太多互通性、安全性、可检阅性的疑虑,所以採用一个标準必须非常审慎。

上一篇: 下一篇:
sunbet开户|人类之家|热榜飞机|网站地图 申博官网备用网址_sunbet充值 申博官网备用网址_申博sunet