@charset "utf-8"单独加在scss开头完全无效,因ruby默认用gbk解码utf-8文件导致读取阶段即报错;必须同步修改engine.rb中encoding.default_external = encoding.find('utf-8'),并确保文件为utf-8无bom、@charset为首行首字符、项目路径不含中文。

@charset "UTF-8" 单独加在 SCSS 文件开头,**完全不能解决编译报错**。真正卡住的是 Ruby 读取文件时用 GBK 解 UTF-8 字节流,直接崩在解析前——那行声明压根没被读到。
为什么 @charset "UTF-8" 加了还报 Invalid GBK character "å"
错误里那个 "å" 是 UTF-8 编码的汉字(比如“中”“我”)首字节,Ruby 却拿 GBK 去解,必然失败。此时 Sass 解析器根本没启动,@charset 还躺在文件里没被看到。
@charset "UTF-8" 只影响 Sass 解析器后续对内容的解释方式,不干预 Ruby 打开文件的底层解码行为。
- 它必须是文件第一行、第一个字符——前面不能有 BOM、空格、注释或空行
- 小写
utf-8在旧版 Sass 中会被忽略 - 它只对最终生成的 CSS 文件生效(告诉浏览器这是 UTF-8),和源文件读取无关
必须改 engine.rb 设置 Ruby 默认外部编码
Windows 下 Ruby 默认 Encoding.default_external 是 GBK,不是 UTF-8。要让它用 UTF-8 打开文件,得手动改 Sass gem 的 engine.rb。
- 先运行
sass -v确认版本,再用bundle show sass或gem which sass查真实路径(别只看系统 Ruby 安装目录) - 典型路径:
C:Ruby25-x64lib ubygems.5.0gemssass-3.7.3libsassengine.rb(Windows)或/usr/local/lib/ruby/gems/3.0.0/gems/sass-3.7.4/lib/sass/engine.rb(macOS) - Koala / CodeKit 用户注意:它们自带 Ruby 环境,得进安装目录找内嵌 gem,比如
D:Koala ubygemsgemssass-3.4.9libsassengine.rb - 在所有
require语句之后、class Sass::Engine或module Sass定义之前插入一行:Encoding.default_external = Encoding.find('utf-8')
SCSS 文件本身必须满足三个硬条件
漏掉任意一条,整个修复链就断了。
- 用 VS Code、Sublime 或 WebStorm 保存为 UTF-8 without BOM(记事本默认带 BOM,要手动选“UTF-8”,别选“ANSI”)
-
@charset "UTF-8";必须是文件第一行、第一个字符,前面零字节 - 项目路径不能含中文,比如
D:我的项目srcstyle.scss会触发 Ruby 编码异常;临时改成D:my-projectsrcstyle.scss验证是否是这个原因
sass --watch 报 Encoding::CompatibilityError: incompatible character encodings: GBK and UTF-8
这是 watch 模块(如 rb-inotify)在 Windows 下对中文路径支持极差导致的,即使 engine.rb 已修复,仍会崩。
- 唯一可靠解法:把整个项目移到纯英文路径,例如
C:projectsmy-app - GUI 工具(Koala、CodeKit)的“项目路径”和“输出路径”都得是英文
- Vue/Element-UI 项目里图标变方块?那不是乱码,是 Dart-Sass 把
e6df转成真实字符后被 CDN 或压缩工具误处理——这种场景该用node-sass或确保写成"\e6df"
engine.rb 是否属于当前项目实际调用的那个 Sass gem。很多用户改了系统 Ruby 下的文件,却忘了 Koala 或 bundle exec sass 用的是自己 bundle 里的 gem。路径不对,改了等于没改。











