SVG 转 Base64 - 以及你为什么多半想要另一种
这个工具会给你想要的 base64,然后再让你看到多数转换器略过的一点:对 SVG 而言,base64 是两种内联方式中较差的那一种。base64 的存在是为了让二进制数据安全地穿过文本通道。而 SVG 本身就是文本,所以为它做这层编码,等于为一个它从未遇到过的问题付出三分之一的体积。百分号编码做的是同一件事,只不过是把少数几个会破坏 URL 的字符转义掉,其余部分原样保留 - 传输时更小,而且仍然可压缩,而 base64 基本上不可压缩。两种形式都在这里生成,旁边带实时字节数,让你在自己的文件上亲眼看到差别,而不是听我们说。一切都在你的浏览器里运行,并且在产出任何内容之前会先净化 SVG。
如何使用此工具
放入你的 SVG
把文件拖到上方方框里或点击选择。它会按内容而非扩展名检查,编码之前所有脚本、事件处理器和远程引用都会被剥离 - 这份输出要进入你的页面,所以先做清理。
对比两种编码
面板会把源文件体积、base64 data URI 体积和 URL 编码 data URI 体积并列显示,并给出百分比差异。在我们测试的那些图标上,URL 编码形式小了 14% 到 18%。
复制你需要的那种形式
五个代码片段,各自带一个复制按钮:原始 base64 载荷、两种 data URI、一个现成的 <img> 标签,以及一条 CSS background-image 声明。你的构建步骤或 CMS 字段需要哪种就取哪种。
留意体积警告
超过约 4 KB 时面板会提醒你。内联的标记无法与承载它的页面分开缓存,所以一个大的 data URI 会在每个包含它的页面上被重新下载 - 到那个体积,链接一个文件几乎总是更好的选择。
常见问题
base64 比原始 SVG 大多少?
在我们实测的四个文件上是 36% 到 43%。一个 290 字节的图标变成了 414 字节的 base64 data URI;它的 URL 编码版本是 339 字节。base64 按设计每三个字节要用四个字符,所以这部分增长中有三分之一是结构性的,其余则来自 data URI 前缀。
为什么 URL 编码对 SVG 更小?
因为只有少数几个字符需要转义。百分号编码为百分号、井号、尖括号和换行各付出三个字节,其余一切原样保留。而 base64 不管字节内容是什么,都按每个字节固定多付 33%。对文本来说,转义税远比这笔固定税小。
URL 编码的版本到处都能用吗?
能,在所有在用的浏览器里都能。不带 base64 标记的 data URI 就是普通的百分号编码文本,它是两种形式中更老、支持也更好的那一种。真正非要 base64 不可的地方,只有那些预设了它的流水线,比如某些 CMS 字段和拒绝另一种形式的老旧构建插件。
你们为什么把我的双引号换成了单引号?
为了不必转义它们。SVG 大部分内容都是属性,而把每个定界符编码成 %22 每次要多花两个字节。属性定界符改成单引号,CSS 值用双引号包裹,于是两者都不需要转义。本来就含有单引号的值会被原样保留并正常转义。
我到底该内联,还是链接到文件?
小而高频使用的图标就内联;更大的一律链接。内联省掉一次请求,但那些字节从此住在每一个用到该图标的页面或样式表里,无法单独缓存。这笔账在 4 KB 左右反转,这也是面板在那里提醒你的原因。
gzip 会改变这个结论吗?
它只会拉大差距,而不是抹平差距。百分号编码的 SVG 仍然是可辨认的文本,带有重复的标签名和属性名,压缩器有大量素材可用。而 base64 的输出在压缩器眼里接近随机噪声,几乎压不动。
我的 SVG 在编码前会被清理吗?
会,而且这在这里比在输出像素的转换器里更重要。脚本、on* 事件处理器、远程图片引用和外部样式表导入都会被移除,面板会列出它找到了什么。一旦内联粘贴,未经净化的 SVG 会把它包含的一切都跑起来。
我能把 data URI 用作 favicon 或用在邮件里吗?
作为 favicon 不行 - 浏览器在那里要的是一个真实 URL。在邮件里同样不行:所有主流客户端都完全屏蔽 SVG,无论是不是 data URI。data URI 是给你自己的网页和样式表用的。要用于邮件,请先把 SVG 转成 PNG,再附件发送或托管它。
为什么我的图标内联之后变成黑色了?
因为它用了 currentColor。data URI 是一份独立的文档,无法继承引用它的那个元素的颜色,于是 currentColor 回退到了初始值。我们的 SVG 转 CSS 工具会检测这一点,并给你一段 mask-image 代码,用元素自身的文字颜色来绘制这个形状。
既然我已经有了 data URI,那个 <img> 标签有什么用?
图个方便,还有 alt 属性。这段代码片段已经预先设好了 alt="",这是装饰性图标的正确取值,也是人们最容易忘掉的一项 - 一张完全没有 alt 属性的图片,会被屏幕阅读器念成它的文件名,而对 data URI 来说那就是一大堵字符墙。
我的文件会被上传到什么地方吗?
不会。这层编码只是在你浏览器里运行的几行算术,所以你的文件不会发送到服务器,不会被存储,我们也永远看不到它。这也意味着没有排队,除了你自己设备内存能容纳的量之外没有体积上限。
您可能还需要
有问题吗? 报告问题