问题描述
我有一个 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 中运行代码并输入一些示例字符进行测试时,我得到:
这就是我每次都希望发生的事情。
但是当我运行 jar 文件时,我得到:
正如您所看到的,jar 文件由于某种原因无法识别希腊语 NAI,并且 yesORno.equals("ΝΑΙ")
不会返回 true
以停止 while 循环。
OXI 也一样
start java -Dfile.encoding=UTF-8 -jar Myfile.jar
但没有解决方案。
我已经做了很多研究来解决这个问题,但我一无所获。
非常感谢您的帮助
解决方法
JVM 参数 -Dfile.encoding
告诉 JVM 它可能遇到的(文本)文件的默认编码是什么。这包括 stdin
、stdout
和 stderr
– 映射到 System.in
、System.out
和 System.err
。但该参数不会改变操作系统中的任何内容。
很可能,您的 Windows CMD 使用的是 Windows-1253 编码,而不是 UTF-8。当您使用 -Dfile.encoding
参数告诉 JVM 它将是 UTF-8 时,那将是彻头彻尾的谎言……
试试 start java -Dfile.encoding=Windows-1253 -jar Myfile.jar
或 start java -Dfile.encoding=ISO-8859-7 -jar Myfile.jar
。
如果您使用 Windows-1253 设置系统,则第二个选项可能会导致其他问题,因为 ISO-8859-7 和 Windows-1253 不完全兼容。但是对于您的测试,它应该可以完成工作。
,根据文档,您使用扫描仪的方式将始终取决于操作系统的编码设置。
查看替代构造函数 - 您可以直接在那里定义编码。您的代码可能看起来像
Scanner in = new Scanner(System.in,"UTF-8");