簡體   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