如何使用 Scanner(System.in)

问题描述

我有一个 Java 项目,我想在其中接收用户的输入。
我在 Eclipse 中编写了代码,运行起来完全没有任何问题。

但是,当我使用 eclipse 将我的类导出到一个可执行的 jar 文件中并尝试在 windows cmd 中运行它时,Scanner(system.in) 无法读取 UTF-8(希腊字符)或其他格式的字符我没有想过。

这是我遇到问题的代码部分:

String yesORno = inp.stringScanner(); // basically a nextLine()
while (!(yesORno.equals("ΝΑΙ") || yesORno.equals("ΟΧΙ"))) { // ΝΑΙ and OXI are greek characters not latin
    System.out.println("Παρακαλώ πληκτρολογίστε 'ΝΑΙ' ή 'ΟΧΙ'"); // please type ΝΑΙ or ΟΧΙ in greek
    yesORno = inp.stringScanner(); // take input again
}

inp 是我用来获取输入的另一个类的对象,在本例中使用方法 stringScanner()

public String stringScanner() {
    Scanner in = new Scanner(system.in);
    return in.nextLine();
}

因此,当我在 Eclipse 中运行代码并输入一些示例字符进行测试时,我得到:

enter image description here

这就是我每次都希望发生的事情。

但是当我运行 jar 文件时,我得到:

enter image description here

正如您所看到的,jar 文件由于某种原因无法识别希腊语 NAI,并且 yesORno.equals("ΝΑΙ") 不会返回 true 以停止 while 循环。

OXI 也一样

我尝试使用 .bat 文件运行 jar 文件,例如:

start java -Dfile.encoding=UTF-8 -jar Myfile.jar

但没有解决方案。

我已经做了很多研究来解决这个问题,但我一无所获。

非常感谢您的帮助

解决方法

JVM 参数 -Dfile.encoding 告诉 JVM 它可能遇到的(文本)文件的默认编码是什么。这包括 stdinstdoutstderr – 映射到 System.inSystem.outSystem.err。但该参数不会改变操作系统中的任何内容。

很可能,您的 Windows CMD 使用的是 Windows-1253 编码,而不是 UTF-8。当您使用 -Dfile.encoding 参数告诉 JVM 它将是 UTF-8 时,那将是彻头彻尾的谎言……

试试 start java -Dfile.encoding=Windows-1253 -jar Myfile.jarstart java -Dfile.encoding=ISO-8859-7 -jar Myfile.jar

如果您使用 Windows-1253 设置系统,则第二个选项可能会导致其他问题,因为 ISO-8859-7 和 Windows-1253 不完全兼容。但是对于您的测试,它应该可以完成工作。

,

根据文档,您使用扫描仪的方式将始终取决于操作系统的编码设置。

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Scanner.html#%3Cinit%3E(java.io.InputStream)

查看替代构造函数 - 您可以直接在那里定义编码。您的代码可能看起来像

Scanner in = new Scanner(System.in,"UTF-8");