当前位置:系统粉 >   IT资讯 >   微软资讯 >  微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛

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

时间:2017-08-16 来源:互联网 浏览量:

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(1)

微软 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 格式大祕辛(2)

(Source:Italo Vignoli CC BY 4.0)

互用性的基石有赖真正的开放文件标准、使用自由字形、跨平台软件,文件标准的重要性不言而喻。深入比较文件基金会的 ODF 与 Microsoft 公司的 OOXML 时,会发现 OOXML 不具备真正符合“标准”意含的东西,其最关键的,是真正的标准不该对过去非标准的东西有相容性。

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

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(3)

远古时代书写不统一,同一件公告要用三种写法各刻一遍。(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 呢?

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

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(4)

(Source:Italo Vignoli CC BY 4.0)

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

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

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(5)

闰年虫问题。(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 档。

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(6)

同样用这篇文章输入。(Source:Italo Vignoli CC BY 4.0)

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(7)

会得到相差悬殊的行数与档案大小。(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 里面会是类似这样的内容(为方便阅读理解有简化过)。

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(8)

(Source:Italo Vignoli CC BY 4.0)

docx 里面则是如此的内容。

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(9)

先垂直再水平看。(Source:Italo Vignoli CC BY 4.0)

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

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

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(10)

XML of ODT(LibreOffice)。

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(11)

为了美观,背后做了非常没有效率的事情。图为 XML of DOCX(MS Office 2016)。(Source:Italo Vignoli CC BY 4.0)

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

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(12)

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 号称开放标准的荒谬。

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(13)

摘自 PX02991.pdf。

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

安全性

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

微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(14)微软文本格式为何常跑掉?揭开 OOXML 格式大祕辛(15)

(Source:Italo Vignoli CC BY 4.0)

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

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

(首图来源:pixabay)

如需获取更多资讯,请关注微信公众账号:Technews科技新报

超爱互联网上的一切东西,喜欢科技、社交、游戏、APP、苹果、小米...还有正妹。

Latest posts by smile

未经许可,任何媒体、网站或个人不得复制、转载、或以其他方式使用本网站的内容,违者必究。

我要分享:

最新热门游戏

版权信息

Copyright @ 2011 系统粉 版权声明 最新发布内容 网站导航