You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java在cmd.exe中读取Unicode输入异常,与Node.js表现不符

解决Windows cmd中Java读取中文控制台输入乱码问题

问题根源在于Windows cmd默认使用GBK(代码页936)编码,而你强制指定UTF-8解码,导致中文无法被正确解析,最终被替换为?。Node.js会自动适配控制台编码,因此能正常读取。以下是几种可行的解决方案:

方案1:使用System.console()(推荐)

Java 6及以上版本提供的System.console()会自动适配控制台的编码,无需手动指定,是最简单可靠的方式:

import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String in = System.console().readLine();
        String chars = in.codePoints()
                .mapToObj(Integer::toString)
                .collect(Collectors.joining(","));
        System.out.println(chars);
    }
}

方案2:匹配控制台实际编码读取

通过JVM系统属性获取控制台的真实编码,再用该编码初始化InputStreamReader:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws IOException {
        // 获取Windows控制台的默认编码(通常为GBK/CP936)
        Charset consoleCharset = Charset.forName(System.getProperty("sun.jnu.encoding"));
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, consoleCharset));
        String in = reader.readLine();
        String chars = in.codePoints()
                .mapToObj(Integer::toString)
                .collect(Collectors.joining(","));
        System.out.println(chars);
    }
}

方案3:修改cmd编码为UTF-8

临时修改cmd的编码为UTF-8(代码页65001),之后运行你的原代码即可正常读取:

  1. 打开cmd,执行命令:chcp 65001
  2. 运行编译后的Java程序

若想永久生效,可以创建cmd快捷方式,在目标栏末尾添加 /k chcp 65001,比如:C:\Windows\System32\cmd.exe /k chcp 65001

内容的提问来源于stack exchange,提问作者rfl890

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:25:11