Windows终端中Java程序System.in的UTF-8编码适配问题求助
解决Windows终端(CMD/PowerShell)中Java多语言字符输入输出乱码问题
核心问题
Windows终端默认编码(如GBK/936)与程序所需的UTF-8编码不匹配,且Java的System.in/System.out默认继承系统编码,导致中日韩等多语言字符在输入输出时出现乱码、匹配失败。
步骤一:配置终端为UTF-8并启用多语言字体
CMD操作
- 打开CMD后,执行命令切换到UTF-8代码页:
chcp 65001 - 右键CMD窗口标题栏 → 属性 → 字体,选择支持中日韩字符的字体(如Consolas、微软雅黑),避免韩文等字符显示为方块。
PowerShell操作
执行以下命令强制设置终端输入输出编码为UTF-8:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 [Console]::InputEncoding = [System.Text.Encoding]::UTF8
步骤二:修改Java代码,显式指定UTF-8编码
需同时强制指定输入流和输出流的UTF-8编码,避免依赖系统默认编码:
import java.io.*; import java.nio.charset.StandardCharsets; public class Main { public static void main(String[] args) { // 用UTF-8包装标准输入流 try (BufferedReader reader = new BufferedReader( new InputStreamReader(System.in, StandardCharsets.UTF_8))) { // 用UTF-8包装标准输出流,自动刷新缓冲区 PrintWriter writer = new PrintWriter( new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true); String expected = "aaa你好123桜色舞うころbbb보여줄게456"; writer.println("请复制以下行的内容粘贴到控制台并按回车结束。"); writer.println(expected); writer.print("请输入:"); String line = reader.readLine(); writer.println("你输入的内容为:" + line); writer.println("输入内容与预期是否一致:" + expected.equals(line)); } catch (IOException e) { e.printStackTrace(); } } }
步骤三:编译并运行程序
Java 8及版本(先编译再运行)
- 编译时指定源码编码为UTF-8,避免源码中字符编译错误:
javac -encoding UTF-8 Main.java - 运行时指定JVM编码为UTF-8:
java -Dfile.encoding=UTF-8 Main
Java 16+(单文件直接运行)
直接用以下命令运行,同时指定源码编码和JVM编码:
java -Dfile.encoding=UTF-8 -encoding UTF-8 Main.java
为什么之前的修改无效?
- 仅给
Scanner指定UTF-8,但System.out仍使用系统默认编码,导致输出乱码; - 使用
GBK编码的Scanner在UTF-8终端下读取输入时,会将UTF-8字节错误解码为GBK,导致字符损坏; - 单独设置
-Dfile.encoding无法覆盖终端与JVM之间的编码对齐问题,必须显式包装输入输出流强制指定UTF-8。
内容的提问来源于stack exchange,提问作者HWinZnieJ
相关产品推荐
相关产品推荐

