@charset "utf-8"无效是因为ruby读取scss文件时用gbk解码utf-8字节流,在sass解析前就报错;必须同步修改engine.rb中encoding.default_external = encoding.find('utf-8'),并确保文件为utf-8无bom、@charset为首行首字符、项目路径不含中文。

为什么加 @charset "UTF-8" 仍然报错
因为错误根本不是 Sass 解析器抛的,而是 Ruby 在读取 SCSS 文件时就崩了。你看到的 Invalid GBK character "\xE5" 是 Ruby 的 I/O 层报的,说明它正用 GBK 编码去解码 UTF-8 字节流(比如中文“中”对应字节 \xE5\x92\x8C),直接失败——此时文件还没传给 Sass,@charset "UTF-8" 连被读到的机会都没有。
这行声明只对最终生成的 CSS 文件生效,告诉浏览器“这个 CSS 是 UTF-8”,和源文件怎么打开毫无关系。
-
@charset "UTF-8"必须是 SCSS 文件第一行、第一个字符:前面不能有 BOM、空格、空行或注释 - 小写
utf-8在旧版 Sass(如 3.7.x)中会被忽略,必须全大写 - 记事本默认保存为 UTF-8 with BOM,VS Code 要选 “Save with Encoding → UTF-8”(不是 “UTF-8 with BOM”)
必须改 engine.rb 中的 Encoding.default_external
Windows 下 Ruby 默认用 GBK 打开文件,而你的 SCSS 是 UTF-8 编码。不改这一层,任何编辑器设置都白搭。
先确认你实际用的 Sass 版本:sass -v;再查真实路径:gem which sass 或 bundle show sass。注意:Koala、CodeKit 等 GUI 工具自带 Ruby 环境,路径在它们安装目录里,不是系统 Ruby 目录。
- 典型路径示例:
C:\Koala\rubygems\gems\sass-3.7.4\lib\sass\engine.rb(Windows)或/usr/local/lib/ruby/gems/3.0.0/gems/sass-3.7.4/lib/sass/engine.rb(macOS) - 在所有
require语句之后、module Sass或class Sass::Engine定义之前,插入一行:Encoding.default_external = Encoding.find('utf-8') - 不要加括号,不要放在
require块内部,否则可能被覆盖
项目路径和文件保存的硬性条件
漏掉任意一项,整个修复链就断了。
- SCSS 文件必须存为 UTF-8 without BOM —— Sublime、WebStorm、VS Code 都支持;记事本务必避开
-
@charset "UTF-8";必须是文件第一行、第一个字符 —— 用命令行验证:head -n1 style.scss | xxd,确保开头没有ef bb bf(BOM) - 项目路径不能含中文,例如
D:\我的项目\src\style.scss会触发 Ruby 编码异常;临时改成D:\my-project\src\style.scss测试是否为此原因
sass --watch 报错但手动编译正常?
这是监听模块(如 rb-inotify 或 listen)在 Windows 下对中文路径支持极差导致的,和编码修复无关。即使 engine.rb 改对了,--watch 仍可能抛出 Encoding::CompatibilityError: incompatible character encodings: GBK and UTF-8。
唯一可靠解法:把整个项目移到纯英文路径,比如 C:\projects\my-app。Koala 用户还要检查“项目路径”和“输出路径”两个地方都得是英文。
最易被忽略的是:改完 engine.rb 后没确认是否改对了 gem 版本路径,或者编辑器悄悄存成了带 BOM 的 UTF-8 —— 这两种情况都会让整个修复链断裂。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











