@charset "utf-8" 无效是因为 ruby 在 sass 编译前以 gbk 解码 utf-8 文件导致崩溃;必须修改 engine.rb 设置 encoding.default_external = encoding.find('utf-8'),并确保文件存为 utf-8 without bom、路径无中文、@charset 为首行首字符。

@charset "UTF-8" 加在 SCSS 文件开头,**不会消除编译警告**,它甚至根本没机会被 Sass 解析器读到——报错发生在 Ruby 读取文件的 I/O 阶段,不是 Sass 编译阶段。
为什么 @charset "UTF-8" 总是无效?
错误信息里出现的 Invalid GBK character "\xE5" 是 Ruby 报的,不是 Sass。Windows 下 Ruby 默认用 GBK 解码文件,而你的 SCSS 文件是 UTF-8 编码(含中文注释、变量名或字体名),Ruby 尝试用 GBK 解 UTF-8 字节流,直接崩溃。此时文件还没传给 Sass,@charset 还躺在磁盘上。
-
@charset "UTF-8"只影响最终输出的 CSS 文件头部,对 Ruby 打开源文件的行为零作用 - 它必须是文件第一行、第一个字符:前面不能有 BOM、空格、空行、注释(VS Code 右下角选“Save with Encoding → UTF-8”,不是 “UTF-8 with BOM”)
- 大小写敏感:
UTF-8必须全大写,utf-8在旧版 Sass 中会被忽略
必须改 engine.rb 中的 Encoding.default_external
核心动作是让 Ruby 用 UTF-8 打开所有文件。这不是编辑器设置能解决的,尤其对 Koala、CodeKit 等自带 Ruby 环境的 GUI 工具,改系统 Ruby 的 engine.rb 完全无效。
- 先运行
sass -v确认当前实际使用的 Sass 版本 - 再用
gem which sass或bundle show sass找真实路径(例如:C:\Koala\rubygems\gems\sass-3.7.4\lib\sass\engine.rb) - 在该文件中,所有
require语句之后、class Sass::Engine或module Sass定义之前,插入一行:Encoding.default_external = Encoding.find('utf-8') - 不要加括号,不要放在
require块内部,否则可能被覆盖
项目路径和文件保存也得同步检查
漏掉任意一项,整个链路就断了。
- SCSS 文件必须存为 UTF-8 without BOM(Sublime / WebStorm / VS Code 默认支持;记事本默认带 BOM,务必避开)
- 项目路径不能含中文,比如
D:\我的项目\src\style.scss会触发 Ruby 编码异常;临时改成D:\my-project\src\style.scss验证是否是这个原因 - 确保
@charset "UTF-8";真的是第一行第一字符——用十六进制编辑器或命令行head -n1 style.scss | xxd可验证无 BOM
编译后 CSS 还乱码?别只盯 SCSS 源文件
即使 SCSS 成功编译,浏览器加载时仍可能二次乱码,需三处统一:
- HTML 中有
<meta charset="UTF-8">,且放在靠前位置 - 编译输出的 CSS 文件头部必须有
@charset "UTF-8";(这是 Sass 自动加的,前提是上面几步都做对了) - HTTP 响应头需含
Content-Type: text/css; charset=utf-8(本地file://协议不生效,开发时建议起轻量服务器)
engine.rb 是绕不过去的硬动作,其他全是配套条件。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











