vscode中markdown预览中文乱码本质是文件打开时编码错配,而非预览器问题;需先通过右下角编码按钮用正确编码(如utf-8或gbk)重新打开文件,确认显示正常后,再选择“save with encoding”→“utf-8(无bom)”保存固化编码。

Markdown预览中文乱码,大概率不是预览器问题
VSCode内置的Markdown预览(Ctrl+Shift+V)本身不参与编码转换——它只是把编辑器里已解码好的Unicode字符串渲染成HTML。所以你看到“浣犲ソ”或“锟斤拷”,说明乱码早在文件被打开时就发生了,预览只是忠实地展示了错误解码后的结果。
换句话说:解决预览乱码,本质是解决文件打开时的编码错配。别去折腾预览插件或CSS,先确认这个文件到底是什么编码存的。
右下角编码按钮点错了,“Reopen with Encoding” ≠ “Save with Encoding”
很多人点开状态栏编码菜单后,随手选了“GBK”就以为搞定了,结果刷新预览还是乱码。这是因为:
- 选“Reopen with Encoding”只是用新编码重新解码当前文件,不改磁盘内容;如果原文件其实是UTF-8带BOM,而你强行用GBK reopen,反而会把BOM头当汉字解析,导致开头多出“”之类字符
- 选“Save with Encoding”才是把内存中已解码的文本,按指定编码写回磁盘——这步必须在正确解码后做,否则等于把乱码“永久保存”
- 常见误操作链:
GBK文件 → VSCode默认UTF-8打开 → 显示乱码 → 点“Reopen with Encoding”选UTF-8 → 还是乱码(因为猜错了)→ 再选GBK → 暂时正常 → 忘记点“Save with Encoding” → 关闭再打开又乱
Python/Node.js生成的Markdown文件,要盯住程序输出编码
如果你的.md文件是脚本动态生成的(比如用<code>markdown-it或python-markdown),乱码源头往往不在VSCode,而在生成环节:
- Python脚本里写
with open("readme.md", "w") as f: f.write("中文"),默认用系统locale编码(Windows中文版就是GBK),但VSCode默认用UTF-8打开 → 必乱 - Node.js里
fs.writeFileSync("readme.md", "中文")默认用UTF-8,但如果终端环境变量LC_ALL或LANG设成zh_CN.GBK,某些库可能受干扰 - 解决方案很简单:显式指定编码。Python加
encoding="utf-8",Node.js加{ encoding: "utf-8" }参数
BOM是隐形推手,尤其对UTF-8文件
Windows上很多编辑器(包括旧版记事本)默认保存UTF-8文件时带BOM(EF BB BF三个字节)。VSCode能识别并忽略它,但某些Markdown解析器(尤其是CI里的静态站点生成器)会把BOM当普通字符渲染,导致网页开头出现空白或异常符号。更麻烦的是:
当你用“Reopen with Encoding”选UTF-8时,VSCode显示正常;但若文件实际是“UTF-8 with BOM”,而你又点了“Save with Encoding” → GBK,VSCode会把BOM头当成GBK字节写进去,彻底毁掉文件结构。
建议:统一用无BOM的UTF-8。在VSCode里打开文件后,右下角点击编码 → 选“Save with Encoding” → 找到UTF-8(注意不是UTF-8 with BOM)→ 保存。之后所有新文件都靠"files.encoding": "utf8"和"files.autoGuessEncoding": false锁死。











