vscode终端默认utf-8而windows输入为gbk导致scanner读中文乱码;需统一编码链:源文件保持utf-8,终端与jvm设为gbk,推荐在launch.json中配置vmargs和env为-dfile.encoding=gbk。

VSCode终端默认编码不是GBK,Scanner读中文必然乱码
Windows下用Scanner读中文却输出???或00???@@@,99%是终端编码和输入源不匹配。系统键盘输入走的是GBK(代码页936),而VSCode内置终端默认是UTF-8(代码页65001)。System.in拿到的是GBK字节流,但Java运行时按UTF-8解码,自然崩坏。
chcp 936只是临时方案,launcher.bat会强制切回65001
你在终端手动执行chcp 936确实能短暂修复,但VSCode Java插件启动调试时会调用launcher.bat,里面硬编码了@chcp.com 65001 > NUL——每次运行都重置为UTF-8,导致你刚切完就失效。
- 用Ctrl+左键点击控制台里跳过的那串路径,定位到
launcher.bat文件 - 把其中的
65001替换成936,保存 - 重启VSCode,否则修改不生效
launch.json里加encoding参数比改bat更可靠
直接在调试配置里声明编码,绕过bat脚本干扰。打开.vscode/launch.json,在configurations数组里对应Java配置项中加入:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
"console": "integratedTerminal",
"env": {
"JAVA_TOOL_OPTIONS": "-Dfile.encoding=GBK"
},
"vmArgs": "-Dfile.encoding=GBK"
注意两点:
-
env里的JAVA_TOOL_OPTIONS对所有JVM子进程生效,包括语言服务器 -
vmArgs只影响当前调试进程,但优先级更高,建议两个都写 - 如果用了
externalTerminal,则需单独配置系统终端(如cmd属性→字体→勾选“使用旧版控制台”)
源文件保存编码必须是UTF-8,别跟终端编码搞混
很多人误以为源文件也要存成GBK,这是错的。VSCode右下角显示的UTF-8是源码文件本身的编码,它决定"请输入中文:"这些字符串字面量怎么解析。这个必须保持UTF-8,否则println输出中文也会乱。
- 确认右下角状态栏显示
UTF-8,点它 → “Save with Encoding” → 选UTF-8 - 不要动
files.encoding设置,除非你明确要存GBK源码(极不推荐) - 真正要对齐的是“用户输入→终端→JVM读取”这条链,不是源文件
launcher.bat或加vmArgs二者选其一即可,但vmArgs方式不用改系统文件,升级插件也不怕被覆盖——这点容易被忽略。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










