Windows上創建的文件,上傳到Linux服務器,文件名亂碼?
事情的起因是這樣的...
最近有這樣一個需求:在Java Web工程中讀取本地某一個文件夾(固定路徑,寫在配置文件中)下的所有文件,然后將其導入到系統中。最直接的方案就是使用java.io.File的listFiles方法列出這個文件夾中的所有文件,然后在做處理,我們也是這樣做的。
在本地測試沒有任何問題,但是一旦部署到生產環境(Linux系統環境),問題就來了:由于文件是通過FTP上傳到固定文件夾中的,所以有一些中文名稱的文件,在上傳到Linux系統中后,就出現了亂碼,程序也無法讀取到。
于是開始檢查tomcat編碼、操作系統編碼格式,都統一設置為UTF-8。
Tomcat:
Linux 服務器編碼:
注:檢查操作系統編碼命令為echo $LANG。查看操作系統語言命令:locale
統一編碼后,問題依然存在。這時候才意識到,由于文件是在windows下生成的,默認編碼都是gbk,所以需要將文件名稱轉碼。
使用 convmv 將文件名轉碼
將文件名稱轉碼,需要用到 convmv,這是一個轉碼工具。
在線安裝 convmv
Linux中安裝命令如下:
如果系統沒有聯網,或者屏蔽了yum命令,可以先下載程序包,然后安裝。
使用程序包安裝步驟
1).下載
下載地址為:??https://pkgs.org/download/convmv??
根據操作系統版本選擇相應的版本下載:
找到下載地址:
2).安裝
將文件拷貝到一個路徑下(比如home),執行安裝命令:
使用 convmv 對中文文件名進行轉碼
安裝完 convmv 之后,就可使用 convmv 轉碼中文文件名了。為了操作方便,可寫一個shell腳本,將文件名稱轉碼:
上述命令,是將 /opt/ftp 路徑下的所有文件名,都統一轉碼為utf8。
這樣中文名稱的文件就能被程序讀取到了。
在 Java Web 工程中應用的時候,每次有新文件上傳,就手動執行一下上述shell腳本,顯然是不現實的,所以最簡單的方法,就是使用 Java 調用 shell 腳本,讓其自動轉碼。
Java 調用 shell 腳本的代碼如下:
至此,問題解決。
以上就是本次分享全部內容,歡迎討論。