CSS Failed to decode downloaded font, OTS parsing error: Failed to convert WOFF 2.0 font to SFNT

本文记录了在Web前端开发过程中遇到的字体加载失败问题及解决方案。主要错误为Chrome浏览器无法解析WOFF2字体,通过更改文件后缀名及字体声明中的format格式解决了该问题。

最近在看一些关于Web前端的资料,在处理一个CSS中出现以下错误,以此记录。

我在WebStorm下编译一个工程,并在上加载索引页,我得到以下警告在在Chrome控制台:

Failed to decode downloaded font: http://localhost:4200/assets/fonts/Simple-Line-Icons.woff2?v=2.4.0
OTS parsing error: Failed to convert WOFF 2.0 font to SFNT
Failed to decode downloaded font: http://localhost:4200/assets/fonts/Simple-Line-Icons.woff2?v=2.4.0
OTS parsing error: Failed to convert WOFF 2.0 font to SFNT
Failed to decode downloaded font: http://localhost:4200/assets/fonts/Simple-Line-Icons.woff2?v=2.4.0
OTS parsing error: Failed to convert WOFF 2.0 font to SFNT


使用的自定义字体和代码:

@font-face {
  font-family: 'simple-line-icons';
  src: url('../fonts/Simple-Line-Icons.eot?v=2.4.0');
  src: url('../fonts/Simple-Line-Icons.eot?v=2.4.0#iefix') format('embedded-opentype'),
       url('../fonts/Simple-Line-Icons.woff2?v=2.4.0') format('woff2'),
       url('../fonts/Simple-Line-Icons.ttf?v=2.4.0') format('truetype'),
       url('../fonts/Simple-Line-Icons.woff?v=2.4.0') format('woff'),
       url('../fonts/Simple-Line-Icons.svg?v=2.4.0#simple-line-icons') format('svg');
  font-weight: normal;
  font-style: normal;
}

我采用的styleExt为SCSS,stylesheet文件后缀名为.css。

解决方法有2种:

1、将xxxx.css改成xxxx.css.scss。

2、改变字体声明中的format格式。将format('woff')改成format('font-woff')

@font-face {
  font-family: 'simple-line-icons';
  src: url('../fonts/Simple-Line-Icons.eot?v=2.4.0');
  src: url('../fonts/Simple-Line-Icons.eot?v=2.4.0#iefix') format('embedded-opentype'),
       url('../fonts/Simple-Line-Icons.woff2?v=2.4.0') format('font-woff2'),
       url('../fonts/Simple-Line-Icons.ttf?v=2.4.0') format('truetype'),
       url('../fonts/Simple-Line-Icons.woff?v=2.4.0') format('font-woff'),
       url('../fonts/Simple-Line-Icons.svg?v=2.4.0#simple-line-icons') format('svg');
  font-weight: normal;
  font-style: normal;
}
你遇到的错误信息: ``` Failed to decode downloaded font: data:font/woff2;base64,... ``` 表明浏览器在尝试加载一个通过 **Base64 编码内嵌** 的 `woff2` 字体文件时失败了。这类问题通常出现在使用自定义字体(如 `@font-face`)并将字体以 Data URL 形式直接嵌入 CSS 或 HTML 中时。 --- ### 🔍 错误原因分析 1. **Base64 数据损坏或不完整** - 内嵌的 Base64 字符串可能被截断、编码错误、包含非法字符。 - 比如复制粘贴过程中丢失部分内容,或者生成工具出错。 2. **MIME 类型不正确** - 虽然写的是 `data:font/woff2;base64,...`,但实际数据可能是 `ttf`, `otf` 等其他格式,导致解码失败。 3. **过长的 Base64 数据引发解析问题** - 浏览器对 Data URL 长度有一定限制(虽然现代浏览器支持很长),但如果处理不当仍可能导致解析失败。 4. **未正确设置 `@font-face` 规则** - 比如缺少 `format('woff2')` 提示,或语法错误。 5. **缓存或构建工具问题** - 构建工具(如 Webpack、Vite)处理字体资源时配置不当,导致输出的 Base64 出错。 --- ### ✅ 解决方案与修复方法 #### ✅ 方法一:验证并修复 Base64 字符串 确保你的 Base64 是完整的、合法的,并且确实是 WOFF2 格式。 ```css @font-face { font-family: 'MyCustomFont'; src: url('data:font/woff2;base64,d09GMgABAAAAAA...ABCDE==') format('woff2'); font-weight: normal; font-style: normal; font-display: swap; /* 推荐使用 swap 避免 FOIT */ } ``` > ⚠️ 注意: > - `d09GMgAB...` 开头是典型的 WOFF2 文件 Base64 前缀。 > - 如果开头是 `UEsDBBQ=`(即 PK 开头 ZIP 结构),那是 TTF/OTF 包装,不是 WOFF2。 > - 使用在线工具 [https://www.base64decode.org/](https://www.base64decode.org/) 可测试是否能正常解码为二进制文件。 🔧 **建议操作步骤:** 1. 将 Base64 字符串提取出来。 2. 用 base64 解码工具还原成 `.woff2` 文件。 3. 用字体查看器(如 FontForge 或在线工具)打开该文件,确认其有效性。 4. 若无效,则重新导出正确的 woff2 字体并重新编码。 --- #### ✅ 方法二:改用外部字体文件(推荐) 避免将大字体嵌入 Base64,改为外部引用更可靠、性能更好。 ```html <!-- index.html --> <link rel="preload" href="fonts/myfont.woff2" as="font" type="font/woff2" crossorigin> ``` ```css /* style.css */ @font-face { font-family: 'MyCustomFont'; src: url('/fonts/myfont.woff2') format('woff2'), url('/fonts/myfont.woff') format('woff'); font-weight: normal; font-style: normal; font-display: swap; } ``` ✅ 优点: - 更易调试(可直接访问 `/fonts/myfont.woff2` 查看是否 404) - 减少 HTML/CSS 体积 - 支持缓存 - 不会出现 “decode failed” 问题 --- #### ✅ 方法三:使用 Webpack/Vite 正确打包字体 如果你使用构建工具,请不要手动拼接 Base64,让工具自动处理。 例如在 Vite 中: ```js // vite.config.js export default { assetsInclude: ['**/*.woff', '**/*.woff2'] } ``` 然后在 CSS 中相对引用即可: ```css @font-face { font-family: 'MyFont'; src: url('./assets/fonts/inter.woff2') format('woff2'); } ``` Vite 会自动决定是否转为 Base64(根据大小阈值)或输出单独文件。 --- #### ✅ 方法四:检查服务器 MIME 类型(针对远程字体) 如果字体是从服务器加载而非内联,需确保返回正确的 `Content-Type`: ```http Content-Type: font/woff2 ``` Nginx 示例配置: ```nginx location ~* \.(woff2|woff)$ { add_header Access-Control-Allow-Origin "*"; add_header Content-Type font/woff2; expires 1y; access_log off; tcp_nodelay off; tcp_nopush on; } ``` --- ### 🛠 工具推荐 | 工具 | 用途 | |------|------| | [Transfonter](https://transfonter.org/) | 将 TTF/OTF 转换为 WOFF2 并生成 @font-face CSS | | [Font Squirrel Generator](https://www.fontsquirrel.com/tools/webfont-generator) | 专业级字体转换 | | Chrome DevTools Network Tab | 查看字体请求状态和响应内容 | --- ### 💡 总结 你现在看到的 “Failed to decode downloaded font” 错误,根本原因是 **浏览器无法从 Base64 数据中恢复出有效的字体文件**。最常见问题是: - Base64 数据本身损坏 - 实际格式与声明不符(比如用了 TTF 的 Base64 却标成 woff2) - 过大的内联数据影响了解析 ✅ **最佳实践建议:** 1. 使用正规工具生成 WOFF2 字体; 2. 使用外链方式引入字体(配合 preload); 3. 避免手动维护长 Base64 字符串; 4. 添加 `font-display: swap` 提升用户体验; 5. 检查网络面板中的字体请求是否成功。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值