根本原因是node.js启动时默认沿用windows控制台代码页(如936),将utf-8字节流误按gbk解码;需配置terminal.integrated.profiles.windows执行chcp 65001,并在terminal.integrated.env.windows中设"node_options": "--experimental-encoding"(node≥18.17.0)及"pythonioencoding": "utf8",重启vscode生效。

Node.js 进程 stdout 输出中文变方块或问号
根本原因是 Node.js 启动时默认沿用 Windows 控制台代码页(如 936),把 UTF-8 编码的 JS 字符串(内部为 UTF-16)错误地按 GBK 解码输出。这不是 VSCode 显示问题,而是进程级编码错配。
验证方式:在 VSCode 终端运行 node -e "console.log(process.stdout.encoding)",若返回 undefined 或 cp936,就坐实了。
- 必须让每个新终端启动即切 UTF-8:在
settings.json中配置"terminal.integrated.profiles.windows",确保 PowerShell 启动命令包含chcp 65001 >nul - 仅靠
chcp 65001不够——它只改终端显示层,Node 进程仍可能 fallback 到旧代码页;需配合环境变量强制生效 - 在
settings.json中添加:"terminal.integrated.env.windows": { "NODE_OPTIONS": "--experimental-encoding", "PYTHONIOENCODING": "utf8" }注意:--experimental-encoding仅在 Node.js ≥18.17.0 有效;低于该版本请升级或改用全局系统环境变量 - 不要依赖
files.encoding:它只控制编辑器读文件,对console.log输出完全无效
Debug Console 和 Output 面板里中文仍是 或空格
这是最隐蔽的一类乱码:Debug Console 和 Output 面板不经过终端进程,而是走 VSCode 内部的 Node.js IPC 通道,chcp 和终端环境变量对其无效。
核心解法是让 Extension Host(插件宿主进程)本身以 UTF-8 模式启动,因为它基于 Node.js。
- 确认你开发或使用的插件是否调用了
process.stdout.setEncoding('utf8')—— 若是你自己写的插件,这是最直接可控的修复点 - VSCode 自身未暴露 IPC 层编码配置项,所以必须从源头干预:确保全局
NODE_OPTIONS已设为--experimental-encoding,并重启 VSCode(不是重载窗口) -
"files.encoding": "utf8"对 Output 面板日志完全无效;chcp 65001也无效——别在这两个地方浪费时间 - 如果用的是旧版 Node(process.stdout.write(Buffer.from("你好", "utf8")) 绕过默认编码逻辑,但仅限调试
npm scripts 输出中文变成 “浣犲ソ” 或
npm run dev 类脚本输出乱码,本质是 npm 启动的子 Node 进程继承了父终端的代码页,而非你的文件编码。即使编辑器里中文注释显示正常,脚本输出仍会崩。
- 必须在
settings.json中统一设置环境变量:"terminal.integrated.env.windows": { "NODE_OPTIONS": "--no-warnings --experimental-encoding", "NPM_CONFIG_LOGLEVEL": "warn", "PYTHONIOENCODING": "utf8" } - 避免在
package.json的scripts里硬写chcp 65001 && node index.js:跨平台不兼容,且无法修复 Debug Console 乱码 - 使用
cross-env是冗余的——VSCode 终端已能通过env.windows精准注入,无需额外依赖 - PowerShell 5.1 用户注意:
$OutputEncoding = [System.Text.UTF8Encoding]::new()对 Node 子进程无穿透力,删掉这类 PowerShell 层设置
终端字体不支持中文,再对的编码也白搭
即使 chcp 65001 生效、NODE_OPTIONS 正确、文件保存为 UTF-8,若终端字体本身不含中文字形(如默认 Consolas),照样显示方块。
- 打开
settings.json,显式设置"terminal.integrated.fontFamily",例如:"terminal.integrated.fontFamily": "'Microsoft YaHei', 'SimSun', 'Consolas', 'monospace'"
注意单引号包裹、英文逗号分隔 - Windows 用户慎用纯
SimSun:缺少等宽变体,可能导致侧边栏或表格对齐错位;Microsoft YaHei更稳 - macOS 用户用
"PingFang SC"或"Heiti SC";Linux 用户检查是否安装fonts-wqy-zenhei或noto-fonts-cjk - 字体设置必须写全 fallback 链——Electron 渲染引擎不会自动补全,漏掉中文字体就会 fallback 到无中文的字体,结果就是方块
NODE_OPTIONS + 完整重启三者咬死生效。任何环节松动,都会导致“终端正常但调试日志还是乱码”这种看似矛盾的现象。











