根本原因是vscode未锁死files.encoding,默认自动推测编码易出错;应设为utf8(无bom)、禁用auto、项目级配置.settings.json,并同步git的core.autocrlf与safecrlf设置。

VSCode保存文件时编码乱码,根本原因是没锁死files.encoding
VSCode默认不强制统一编码,它会“猜”你当前文件的编码(比如从UTF-8、GBK、ISO-8859-1里选),猜错就乱码。尤其打开老项目或Windows下生成的文件时,files.encoding可能被设成utf8bom或system,一保存就悄悄改掉原有编码。
真正管用的做法不是每次手动选,而是让VSCode“永远只用UTF-8无BOM”存所有新文件和已有文件:
- 打开设置(
Ctrl+,或Cmd+,),搜files.encoding - 把
Files: Encoding的值改成utf8(不是utf8bom,也不是auto) - 勾选
Files: Auto Save,避免忘记保存导致编码未生效 - 如果已有文件已用其他编码打开,先用右下角编码栏点击 →
Reopen with Encoding→ 选UTF-8,再点右下角 →Save with Encoding→ 选UTF-8
为什么不能设成utf8bom?
UTF-8 BOM 是微软系遗留产物,开头加\uFEFF三字节标记。多数现代工具(Node.js、Python 3、Git diff、CI脚本)不欢迎它:Python会报SyntaxError: Non-UTF-8 code starting with '\xef',Git显示diff异常,Webpack构建也可能出警告。
除非明确对接旧版IE或某些.NET系统,否则一律用utf8(无BOM):
-
utf8:标准、通用、无副作用 -
utf8bom:仅Windows记事本友好,其他地方全是坑 -
auto:VSCode会按文件内容推测,但推测不可靠,尤其混合中文和英文的文件
工作区级配置比用户级更安全
全局设files.encoding看似一劳永逸,但团队协作时容易踩坑——有人本地设了gbk,提交后别人拉下来直接乱码。正确做法是把编码策略落到项目里:
- 在项目根目录加
.vscode/settings.json - 写入:
{ "files.encoding": "utf8" } - 这样每个打开该文件夹的VSCode都会强制使用
utf8,不受个人设置干扰 - 顺便加一句
"files.autoSave": "afterDelay",避免编辑中途意外中断导致编码未应用
Git提交后仍乱码?检查core.autocrlf和core.safecrlf
VSCode编码设对了,但Git checkout后文件还是乱码,大概率是换行符+编码混在一起触发的二次污染。Windows上常见:
- Git默认开启
core.autocrlf=true,会把LF转CRLF,而某些编辑器把CRLF当编码线索误判为GBK - 运行
git config --global core.autocrlf input(macOS/Linux)或false(Windows纯UTF-8项目) - 加一行
git config --global core.safecrlf false,防止Git因编码问题拒绝提交 - 最后执行
git add --renormalize .重置所有文件的行尾,再提交
编码这事没有“设一次就永远稳”,关键在于切断所有自动推测路径:关掉auto、禁用BOM、配置落到项目里、连Git的换行逻辑也同步对齐。漏掉任意一环,都可能在某个深夜改个配置文件时突然崩出一堆方块。











