VSCode中文注释/字符串显示方框是editor.unicodeHighlight功能误判所致,非字体问题;关闭editor.unicodeHighlight.nonBasicASCII、invisibleCharacters和ambiguousCharacters三项设置即可解决,无需重启,保存即生效。

中文注释/字符串里出现方框,不是字体问题
VSCode 1.64+ 默认开启 editor.unicodeHighlight 功能,会把所有非 ASCII 字符(包括中文、日文、emoji)当作“可疑 Unicode 字符”加方框高亮——这不是渲染失败,而是主动叠加的 SVG 图形层。鼠标悬停在方框上,通常会显示类似 U+4F60 的码点提示,这就是确认信号。
这类方框只出现在编辑器内容区(注释、字符串字面量),不影响界面菜单、终端或侧边栏;也不报错、不崩溃,容易被误判为字体缺失。
- 禁用最直接:设
editor.unicodeHighlight.nonBasicASCII为false - 顺带关掉另外两个开关更彻底:
editor.unicodeHighlight.invisibleCharacters和editor.unicodeHighlight.ambiguousCharacters - 不想全关?可用白名单:
editor.unicodeHighlight.allowedLocales设为["zh-hans"](注意必须是数组)
编辑器界面或菜单全是方框,大概率是 locale.json 没生效
VS Code 1.70+ 已弃用 settings.json 中的 locale 字段,只认用户级 ~/.vscode/locale.json。很多人手写 "locale": "zh-cn" 到 settings 里,结果完全没反应。
正确做法是:按 Ctrl+Shift+P → 输入并执行 Configure Display Language → 选 zh-cn → 保存。VS Code 会自动生成合法路径的 locale.json。
- 改完必须完全退出 VS Code:
killall code(Linux/macOS)或任务管理器杀干净进程 - 若用 snap/flatpak 安装,几乎必然失效——沙盒默认禁止访问系统语言资源,换官网 .deb/.rpm 包安装才可靠
- 中文语言包要装,但装了 ≠ 自动启用;没执行
Configure Display Language,语言包就是摆设
文件打开就是满屏 □,先试右下角 Reopen with Encoding → GBK
Windows 上记事本保存的中文,默认是 GBK 编码,但 VSCode 默认按 UTF-8 解码,字节流对不上,就变成方块。这不是 bug,是行为一致:VSCode 严格按 BOM 或启发式判断解码,而记事本不写 BOM、也不声明编码。
点右下角当前编码(如 UTF-8)→ Reopen with Encoding → 优先试 GBK。如果文字立刻变正常,说明原始编码就是 GBK;如果更乱,关掉重开再试其他选项。
-
Reopen with Encoding是只读操作,不改文件内容,安全可逆 - 别信
files.autoGuessEncoding:对无 BOM 的 GBK 文件基本猜错,常判成windows1252,建议直接设为false - 确认 GBK 能看后,立刻点右下角 →
Save with Encoding→utf8(小写,无 BOM),这才是真修复
终端里 print("中文") 是方块或问号,和文件编码无关
编辑器里文件能正常显示 ≠ 终端能正常输出。这是 stdout 编码(Python 进程)和终端解码(CMD/PowerShell/Terminal)没对齐导致的。例如 Python 按 UTF-8 输出,CMD 却用 CP936(即 GBK)去解,中间没协商,必然乱码。
Windows 下最稳方案:在 settings.json 加这一行:"terminal.integrated.env.windows": {"PYTHONIOENCODING": "utf8"}。注意别碰已弃用的 terminal.integrated.encoding,设了也无效。
- 临时验证:终端里先运行
chcp 65001,再跑 Python 脚本,如果立刻正常,就坐实是这个原因 - 终端字体也要单独配:
terminal.integrated.fontFamily必须显式列出中文字体,比如"Cascadia Code", "Microsoft YaHei", "monospace" - 改完记得新开终端面板——旧终端不会刷新字体链或环境变量
复杂点在于:同一处“方框”,可能对应四个完全不同的底层机制(Unicode 高亮、locale 加载、文件解码、终端编码),不能靠一个配置通杀。最容易被忽略的是——你看到的“编码显示”只是 VSCode 的当前假设,不是文件真相;而你改的设置,可能根本没被加载(比如 locale.json 路径错、snap 沙盒拦截、锁图标锁定文件)。











