HWinZnieJ 2023-09-28 21:56 采纳率: 0%
浏览 12

关于Java在CMD中System.in的字符编码

怎么让下面这个程序在Windows的终端(如CMD,PowerShell)中正常运行?

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请将下面一行的内容复制,然后粘贴到控制台中,按回车键结束");
        System.out.println("aaa你好123桜色舞うころbbb보여줄게456");
        System.out.print("请输入:");
        String line = scanner.nextLine();
        System.out.println("您输入的内容是:" + line);
        System.out.println("您输入的内容和预期的内容是否一致:" + line.equals("aaa你好123桜色舞うころbbb보여줄게456"));
    }
}

在IDEA中能正常运行,运行结果为:

请将下面一行的内容复制,然后粘贴到控制台中,按回车键结束
aaa你好123桜色舞うころbbb보여줄게456
请输入:[输入:]aaa你好123桜色舞うころbbb보여줄게456
您输入的内容是:aaa你好123桜色舞うころbbb보여줄게456
您输入的内容和预期的内容是否一致:true

在CMD中使用命令java Main.java运行,运行结果分别为:

  • 代码页为936(GBK)

    请将下面一行的内容复制,然后粘贴到控制台中,按回车键结束
    aaa你好123桜色舞うころbbb????456
    请输入:aaa你好123桜色舞うころbbb????456
    您输入的内容是:aaa???123?@??????bbb????456
    您输入的内容和预期的内容是否一致:false
    

    第二行韩文无法正常输出,且后续获取的中文、日文不正确

  • 代码页为65001 (UTF-8)

    请将下面一行的内容复制,然后粘贴到控制台中,按回车键结束
    aaa你好123桜色舞うころbbb보여줄게456
    请输入:aaa你好123桜色舞うころbbb보여줄게456
    您输入的内容是:aaa&&123&&&&&&bbb&&&&456
    您输入的内容和预期的内容是否一致:false
    

    第二行输出正常,但后续获取的中文、日文、韩文均不正确

尝试更改代码如下:

import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in, "UTF_8");
        System.out.println("请将下面一行的内容复制,然后粘贴到控制台中,按回车键结束");
        System.out.println("aaa你好123桜色舞うころbbb보여줄게456");
        System.out.print("请输入:");
        String line = scanner.nextLine();
        System.out.println("您输入的内容是:" + line);
        System.out.println("您输入的内容和预期的内容是否一致:" + line.equals("aaa你好123桜色舞うころbbb보여줄게456"));
    }
}

在IDEA、CMD中的输出和上述一致,结果不正确

再次尝试更改代码如下:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in, "GBK");
        System.out.println("请将下面一行的内容复制,然后粘贴到控制台中,按回车键结束");
        System.out.println("aaa你好123桜色舞うころbbb보여줄게456");
        System.out.print("请输入:");
        String line = scanner.nextLine();
        System.out.println("您输入的内容是:" + line);
        System.out.println("您输入的内容和预期的内容是否一致:" + line.equals("aaa你好123桜色舞うころbbb보여줄게456"));
    }
}

IDEA中的运行结果变成了:

请将下面一行的内容复制,然后粘贴到控制台中,按回车键结束
aaa你好123桜色舞うころbbb보여줄게456
请输入:aaa你好123桜色舞うころbbb보여줄게456
您输入的内容是:aaa浣犲ソ123妗滆壊鑸炪亞銇撱倣bbb氤挫棳欷勱矊456
您输入的内容和预期的内容是否一致:false

在CMD中使用命令java Main.java运行,运行结果分别为:

  • 代码页为936(GBK)

      请将下面一行的内容复制,然后粘贴到控制台中,按回车键结束
      aaa你好123桜色舞うころbbb????456
      请输入:aaa你好123桜色舞うころbbb????456
      您输入的内容是:aaa你好123桜色舞うころbbb????456
      您输入的内容和预期的内容是否一致:false
    

    虽然看起来第二行和第四行的输出一致,但是第二行的输出中的韩文无法正常输出,且后续判断的结果不为true
    如果输入正确的内容,如下:

    请将下面一行的内容复制,然后粘贴到控制台中,按回车键结束
    aaa你好123桜色舞うころbbb????456
    请输入:aaa你好123桜色舞うころbbb보여줄게456
    您输入的内容是:aaa你好123桜色舞うころbbb????456
    您输入的内容和预期的内容是否一致:false
    

    结果仍不正确

  • 代码页为65001 (UTF-8)

      请将下面一行的内容复制,然后粘贴到控制台中,按回车键结束
      aaa你好123桜色舞うころbbb보여줄게456
      请输入:aaa你好123桜色舞うころbbb보여줄게456
      您输入的内容是:aaa&&123&&&&&&bbb&&&&456
      您输入的内容和预期的内容是否一致:false
    

    结果也仍不正确

此外

也尝试过添加参数运行,如

java -Dfile.encoding=UTF-8 Main.java

java -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 Main.java

但结果都不正确

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-09-30 09:42
    关注

    该回复引自强大而免费的微信小程序:皆我百晓生。


    为了在Windows的终端中正确运行,您可以尝试以下方法:

    1. 设置终端的字符编码:
      在Windows的终端中,可以使用chcp命令来设置终端的字符编码,例如chcp 65001来设置为UTF-8编码。

    2. 修改程序的字符编码:
      尝试使用Scanner构造器中的charset参数来设置正确的字符编码,例如UTF-8。

    import java.nio.charset.Charset;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in, Charset.forName("UTF-8"));
            //...
        }
    }
    

    尝试以上两种方法是否能让程序在Windows的终端中正常运行。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月28日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境