繁体   English   中英

如何使用 Scanner(System.in) 在 jar 文件中输入 UTF-8 字符

[英]How to enter UTF-8 characters inside a jar file using Scanner(System.in)

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

However, when I export my classes into an executable-jar file using eclipse and try to run it in the windows cmd, the Scanner(System.in) can't read charachters in UTF-8 (greek characters) or something else that i haven'没想过。

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

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 是另一个inp的 object ,我用它来获取输入,在这种情况下使用方法stringScanner()

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

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

在此处输入图像描述

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

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

在此处输入图像描述

如您所见,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 时,那将是一个彻头彻尾的谎言……

Try start java -Dfile.encoding=Windows-1253 -jar Myfile.jar or start 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.ZF98ED07A4D5F50F7DEFZ141.

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM