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),之后运行你的原代码即可正常读取:
- 打开cmd,执行命令:
chcp 65001 - 运行编译后的Java程序
若想永久生效,可以创建cmd快捷方式,在目标栏末尾添加 /k chcp 65001,比如:C:\Windows\System32\cmd.exe /k chcp 65001
内容的提问来源于stack exchange,提问作者rfl890
相关产品推荐
相关产品推荐

