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日

悬赏问题

  • ¥100 两个按钮控制一个LED
  • ¥15 用C语言写离散数学相关问题
  • ¥30 如何用python的GephiStreamer连接到gephi中,把Python和Gephi的具体操作过程都展示,重点回答Gephi软件的调试,以及如果代码的端口在浏览器中无法显示怎么处理
  • ¥15 ansys机翼建模肋参数
  • ¥15 Sumo软件无法运行
  • ¥15 如何在vscode里搭建stata的编辑环境?
  • ¥15 dify知识库创建问题
  • ¥15 如何用C#的chart画1000万个点不卡顿
  • ¥15 爬虫技术找到网上看过房源客户的电话
  • ¥20 代码:Python随机森林反演生物量数据处理问题