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