我有一個簡單的 java 程式,運行時應該遍歷 Unix 服務器上的整個目錄,并記錄檔案服務器上包含挪威字母“?,?,?”的所有檔案。
這是使用 winSCP 在檔案服務器上的外觀:

最后,logs.log 檔案應如下所示:
2022-10-25 14:27:02 INFO Logger:99 - File: 'DN_Oppm?lings.pdf'
2022-10-25 14:27:02 INFO Logger:99 - File: 'Salg_av_g?rden.pdf'
但是,這就是它在日志檔案中的結束方式,所有挪威字母都用正方形表示。

我似乎無法弄清楚為什么會這樣。它可能與編碼有關。因為當我在本地 Windows 上運行它時,一切都按預期運行,我得到了我需要的結果。但是,當我將專案構建為可執行 jar 并在服務器上運行時,它會出錯。
這是我正在使用的代碼。
public static void renameFiles3(File[] files) throws IOException {
for (File filename : files) {
if (filename.isDirectory()) {
renameFiles3(filename.listFiles());
} else {
String fileNameString = filename.getName();
if (fileNameString.contains("?") || fileNameString.contains("?") || fileNameString.contains("?")){
logger.info("File: '" filename.getName());
}
}
}
}
public static void main(String[] args) {
File[] files = new File(path).listFiles();
try {
renamer.renameFiles3(files);
} catch catch(IOException ex){
logger.error(ex.toString());
}
}
有人指出應該指定編碼,但我不確定這是如何完成的。如果我在 Unix 服務器上運行“locale”命令,這就是我得到的輸出。
[e1111111@ilt repository]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
我使用 Putty 運行 jar 檔案。這是配置。

運行 jar 時出現的錯誤的堆疊跟蹤:
java.nio.file.NoSuchFileException: ./documentRepository/DN_Oppm?lings.pdf
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)
at java.base/sun.nio.fs.UnixCopyFile.move(UnixCopyFile.java:430)
at java.base/sun.nio.fs.UnixFileSystemProvider.move(UnixFileSystemProvider.java:267)
at java.base/java.nio.file.Files.move(Files.java:1422)
at com.example.fixfilenamesonfileserver.Renamer.renameFiles2(Renamer.java:105)
at com.example.fixfilenamesonfileserver.Renamer.renameFiles2(Renamer.java:89)
at com.example.fixfilenamesonfileserver.Renamer.renameFiles2(Renamer.java:89)
at com.example.fixfilenamesonfileserver.Renamer.renameFiles2(Renamer.java:89)
at com.example.fixfilenamesonfileserver.Renamer.renameFiles2(Renamer.java:89)
at com.example.fixfilenamesonfileserver.Renamer.renameFiles2(Renamer.java:89)
at com.example.fixfilenamesonfileserver.Renamer.renameFiles2(Renamer.java:89)
at com.example.fixfilenamesonfileserver.Renamer.main(Renamer.java:154)
更奇怪的是,例如,我可以創建一個帶有 mkdir 的檔案夾,其中包含名稱中的挪威字母,如果我創建一個包含挪威字母的檔案,它將正確顯示并正確記錄。
uj5u.com熱心網友回復:
前段時間,我為一個非常相似的問題寫了一個答案。
如上述解決方案所述,問題可能與在本地 Windows 筆記本電腦(可能cp-1252或某些變體)和服務器中使用不同的字符集有關。
按照建議,請考慮查看每個環境中 JVM 中的字符集,并在必要時查看并調整file.encoding筆記本電腦和服務器環境上的系統屬性的值,也許它會幫助您解決問題。
file.encoding使用適當的JVM 屬性值運行 jar可能會使應用程式正常作業:
java -Dfile.encoding=UTF-8 -jar your_app.jar
uj5u.com熱心網友回復:
我懷疑您的 Java 和檔案都沒有問題。
問題可能出在您用于查看該文本的應用程式上。該應用程式使用的字體缺少這些字符的字形。
如果您需要進一步的幫助,請編輯您的問題以記錄應用程式和作業系統。
uj5u.com熱心網友回復:
假設您將字母列印到終端,問題很可能是您使用的終端。如果要將字符列印到終端,請確保將其設定為 chcp65001,以及支持完全顯示挪威字母的字體。由于缺乏對同一字體中多種語言的支持,我在嘗試顯示多語言文本時遇到了類似的問題。
因此,總結一下,首先將終端代碼頁編碼設定為 chcp 65001,然后將終端的字體更改為完全支持挪威字母的字體,然后從終端運行 jar 檔案,如:java -jar <jarname>.jar
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/529291.html
