必须修改engine.rb中encoding.default_external = encoding.find('utf-8'),因ruby默认用gbk解码utf-8文件,读取阶段即报错,@charset根本未执行;同时需确保scss为utf-8无bom、@charset为首行首字符、项目路径不含中文。

因为 Ruby 版 Sass 在读取文件阶段就用 GBK 解码 UTF-8 文件,中文注释触发字节错位,导致解析器提前崩溃——@charset 压根没机会被执行。
SCSS 文件还没进 Sass 解析器,Ruby 就已经崩了
Ruby(尤其 Windows 下)默认 Encoding.default_external = 'GBK',它不管你的文件是不是 UTF-8,直接用 GBK 去解码字节流。一个中文在 UTF-8 中占 3 字节,GBK 中占 2 字节,错位后就会出现类似 Invalid GBK character "\xE5" 这种报错。此时文件内容根本没传进 Sass 解析器,@charset "UTF-8" 再正确也毫无意义。
- 错误现象:编译静默失败、CSS 输出为空、控制台只报编码异常,不提示具体哪行 SCSS 有错
- 验证方式:用
xxd style.scss | head -1检查是否为 UTF-8 without BOM;再用sass -v确认是否 Ruby Sass(非 Dart Sass) - 关键点:这个阶段失败,和注释内容无关,和文件编码与 Ruby 默认解码方式的冲突有关
为什么中文注释特别容易暴露这个问题
英文注释或无注释时,文件里全是 ASCII 字符,GBK 和 UTF-8 解码结果一致,Ruby 不会报错;一旦加入中文注释,就立刻触发双编码错位,成为“第一块倒下的多米诺骨牌”。
- 常见诱因:
/* 优化按钮样式 */、// 适配移动端(注意:CSS 不支持//,这是 Less/Sass 的语法,但被误粘贴进纯 SCSS 也会引发问题) - 更隐蔽的情况:注释里混有全角空格、emoji 或从微信/钉钉复制来的带格式文字,这些在 UTF-8 中字节数更多,错位更剧烈
- 不是注释本身有问题,而是它让底层编码冲突“显形”了
绕过 Ruby 编码限制的实操路径
如果你必须用 Ruby Sass(比如旧项目绑定 Koala / CodeKit),不能换 Dart Sass,那就得从 Ruby 层动手脚,而不是只改 SCSS 文件。
- 找到你实际在用的 Sass gem 路径:
bundle show sass或sass -v后查gem environment gemdir - 编辑
lib/sass/engine.rb,在所有require之后、module Sass之前插入:Encoding.default_external = Encoding.find('utf-8') - 同时确保 SCSS 文件满足三个硬条件:
UTF-8 without BOM、@charset "UTF-8";是首行首字符、项目路径不含中文 - 改完别忘了重启编译工具(Koala 需完全退出重开,VS Code 的 Live Sass Compiler 插件需重载窗口)
最易被忽略的是:改了 engine.rb 却没确认改的是当前项目真正加载的那个 gem,或者编辑器悄悄存成了 UTF-8 with BOM —— 这两种情况会让所有操作归零。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











