VSCode默认仅对含中文等非ASCII字符的新建未保存文件自动加BOM;永久禁用需设"files.encoding": "utf8"且"files.autoGuessEncoding": false,并检查.editorconfig及插件干扰。

VSCode保存UTF-8文件时为什么总带BOM
VSCode默认对UTF-8编码的文件,**只在“新建未保存文件”且内容含中文等非ASCII字符时自动加BOM**;但一旦你手动用File > Save with Encoding > UTF-8 with BOM存过一次,它就会记住这个选择,后续保存都沿用——不是VSCode“顽固加BOM”,是你自己(或插件)触发过一次带BOM的保存。
怎么永久禁用UTF-8 BOM自动写入
关键在设置项"files.encoding"和"files.autoGuessEncoding"的组合行为。光设"files.encoding": "utf8"不够,必须关掉自动猜测,否则VSCode可能误判并回退到utf8bom。
- 打开设置(
Ctrl+,或Cmd+,),搜索files.encoding,设为utf8(注意:不是utf8bom) - 再搜
files.autoGuessEncoding,**必须设为false**——这是最容易漏的一步 - 如果已存在带BOM的老文件,直接用VSCode打开后,右下角编码显示会是
UTF-8 with BOM,点击它 → 选Save with Encoding > UTF-8,立刻清除BOM
插件或旧配置导致BOM反复出现
某些插件(比如EditorConfig、Auto Rename Tag早期版本)或项目根目录下的.editorconfig文件,可能强制覆盖VSCode编码设置。常见现象是:改完设置重启VSCode,新建文件仍带BOM。
- 检查项目根目录有无
.editorconfig,里面是否含charset = utf-8-bom或charset = utf-8以外的值 - 临时禁用所有插件(
Ctrl+Shift+P→Developer: Disable All Installed Extensions),新建文件测试是否还带BOM - 全局
settings.json里确认没有重复定义"files.encoding",尤其注意工作区设置(.vscode/settings.json)优先级更高
Git提交时BOM引发的diff污染
BOM是三个不可见字节(EF BB BF),Git diff里会显示成^@^@^@或乱码,合并冲突时极难分辨真实改动。这不是VSCode显示问题,是Git底层按字节比对的结果。
- 用
git ls-files --eol可查当前文件实际编码和BOM状态 - 批量清理已有文件BOM:
find . -name "*.js" -exec sed -i '1s/^\xEF\xBB\xBF//' {} \;(Linux/macOS) - Windows用户可用
notepad++批量转码,但VSCode里务必确保files.autoGuessEncoding为false,否则下次保存又悄悄加回去
BOM问题本质不是编码选错,而是VSCode在“自动推断”和“显式声明”之间摇摆——只要关掉自动猜测,明确指定utf8,它就不会自作主张。但一旦项目里混进一个.editorconfig或某个插件偷偷改设置,就前功尽弃。











