解決 proftpd 造成中文檔名亂碼的問題
12 月 21
FreeBSD筆記本 FreeBSD, proftpd, 主機管理 No Comments / 7,370 views
在 proftpd 1.3.1rc1 之後,開發者似乎替程式加入了一些語言上的規劃,雖然目的是為了解決檔名的問題,但卻也造成不少困擾。
在爬文測試過後,發現有幾個前提要先釐清:
- 文件上常被提到的指令:
a. LangEngine on|off
b. LangPath /path/to/your/locale
c. LangDefault
d. UseEncoding on|off|local_charset client_charset
e. UseUTF8 on|off <--- 這指令在 1.3.3 並不支援 - 編譯時的關鍵參數 --enable-nls (Native Language Support, default=no)
但在 FreeBSD 用 ports 安裝時,預設是打開的。 - 系統端的使用字集 Charset
現在越來越多系統是採用 unicode 了,這部份可以自訂,但目前我的習慣還是用 Big5。 - 用戶端的使用字集
雖然 unicode 推行很久了,但很多時候微軟的程式還是以當地字集來運作,對繁體中文使用者來說,那就是big5。而是否支援unicode則是個別軟體的問題。 - 越來越多 FTP Client 支援自訂字集
例如 FileZilla,而早期的 client 則是以用戶端的字集決定。
那麼,亂碼究竟是怎麼產生的?簡單來說,就是當 FTP Client 無法判別檔名字集時,它就會變成亂碼,或像 FileZilla 一樣自動隱藏。
因此,在 proftpd 1.3.3 之後,如果你啟用了 nls 功能,它就預設以 UTF-8 來處理所有的訊息,然後再依 UseEncoding 的設定來作 iconv。
這時,只要使用不支援自訂字集的 FTP Clients, 像早期的 FTP 程式或透過檔案總管,那麼它就會誤把 big5 的檔名解讀為 utf8,造成亂碼。
解決方式:
- 重新編譯 proftpd
把 NLS 功能關掉,讓 proftpd 用原生字集去運作。 - 將 FileZilla 的字集強制設為 big5,確保檔名在雙向傳輸時不被誤解。(其實有點像是為了向下相容,配合其他舊程式的運作。)
事實上,如果讓字集以自動偵測或強制使用 UTF-8,FileZilla 都能正確顯示檔案。(因為 proftpd 會如實顯示主機上的實體檔名,而 FileZilla 都能判讀。)
但為了具備一致性,所以改成 big5 比較保險。 - 以其它程式上傳,例如 UltraEditor,它也是用原生字集去運作的。所以檔名也都正常。
缺點:
- 如果你是想跨區交換檔案,例如台灣和大陸分公司,那麼一邊用 big5,一邊用 gb2312,那一定是自找麻煩。這種情況下,應該以 utf8 方式運作才是王道。
- 相反的,如果你想利用utf8來解決檔名亂碼的問題,那就不能用那些老掉牙的程式來傳檔,攪亂一池春水。這時,應該以能支援 utf8 的程式或 web-based 的介面來解決檔名編碼的問題。