@charset "UTF-8" 单独加在 SCSS 文件开头大概率无效,因 Ruby 读取文件时默认用 GBK 解码,导致含中文的文件解码失败而无法进入 Sass 解析阶段;需同时将文件存为 UTF-8 without BOM、确保 @charset 为首行首字符,并修改对应 sass gem 的 engine.rb 中 Encoding.default_external = Encoding.find('utf-8')。

@charset "UTF-8" 单独加在 SCSS 文件开头,大概率无效。真正卡住编译的是 Ruby 读取文件时的编码解码阶段,不是 Sass 解析阶段。
为什么 @charset "UTF-8" 经常不生效
常见错误信息如 Syntax error: Invalid GBK character "\xE5",说明 Ruby 在把文件内容传给 Sass 前就解码失败了——@charset 根本没机会被看到。这是因为:
- Ruby(尤其 Windows 下)默认用
Encoding.default_external=GBK打开文件,而非 UTF-8 -
@charset只影响 Sass 解析器对已读入内容的解释方式,不改变 Ruby 底层读取时的解码行为 - 若文件带 BOM 或开头有空格/注释,
@charset就不算“首行首字符”,直接被忽略 - 部分旧版 Sass 对大小写敏感:
utf-8可能不认,必须写UTF-8
必须同步修改 Ruby 的 Encoding.default_external
找到你当前项目实际使用的 Sass gem 对应的 engine.rb 文件(用 sass -v 查版本,再查 gem environment gemdir 确认路径),典型位置:
- Windows:
C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\sass-3.7.3\lib\sass\engine.rb - macOS:
/usr/local/lib/ruby/gems/3.0.0/gems/sass-3.7.4/lib\sass\engine.rb - Koala 等 GUI 工具:进其安装目录找自带 Ruby 环境下的 sass gem 路径,不是系统 Ruby
在所有 require 语句之后、module Sass 定义之前插入:
Encoding.default_external = Encoding.find('utf-8')
注意:require 是关键字,别加括号;这行不能放在 require 块内部,否则可能被覆盖。
SCSS 文件本身也要满足三个硬条件
漏掉任意一条,@charset 都白加:
- 文件保存为
UTF-8 without BOM(VS Code/Sublime 中选 “Save with Encoding → UTF-8”;别选 “UTF-8 with BOM”) -
@charset "UTF-8";必须是文件第一行、第一个字符,前面不能有任何空格、空行、BOM 或注释 - 字体名等中文内容建议转 Unicode 编码(如
font-family: "\5B8B\4F53";),避免依赖 CSS 运行时解码
最易被忽略的点:改完 engine.rb 后没确认是否改对了 gem 版本路径,或者编辑器悄悄存成了带 BOM 的 UTF-8 —— 这两种情况都会让整个修复链断裂。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











