解決 proftpd 造成中文檔名亂碼的問題

No Comments / 7,370 views

在 proftpd 1.3.1rc1 之後,開發者似乎替程式加入了一些語言上的規劃,雖然目的是為了解決檔名的問題,但卻也造成不少困擾。

在爬文測試過後,發現有幾個前提要先釐清:

  1. 文件上常被提到的指令:
    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 並不支援
  2. 編譯時的關鍵參數 --enable-nls  (Native Language Support, default=no)
    但在 FreeBSD 用 ports 安裝時,預設是打開的。
  3. 系統端的使用字集 Charset
    現在越來越多系統是採用 unicode 了,這部份可以自訂,但目前我的習慣還是用 Big5。
  4. 用戶端的使用字集
    雖然 unicode 推行很久了,但很多時候微軟的程式還是以當地字集來運作,對繁體中文使用者來說,那就是big5。而是否支援unicode則是個別軟體的問題。
  5. 越來越多 FTP Client 支援自訂字集
    例如 FileZilla,而早期的 client 則是以用戶端的字集決定。

那麼,亂碼究竟是怎麼產生的?簡單來說,就是當 FTP Client 無法判別檔名字集時,它就會變成亂碼,或像 FileZilla 一樣自動隱藏。

因此,在 proftpd 1.3.3 之後,如果你啟用了 nls 功能,它就預設以 UTF-8 來處理所有的訊息,然後再依 UseEncoding 的設定來作 iconv。

這時,只要使用不支援自訂字集的 FTP Clients, 像早期的 FTP 程式或透過檔案總管,那麼它就會誤把 big5 的檔名解讀為 utf8,造成亂碼。

解決方式:

  1. 重新編譯 proftpd
    把 NLS 功能關掉,讓 proftpd 用原生字集去運作。
  2. 將 FileZilla 的字集強制設為 big5,確保檔名在雙向傳輸時不被誤解。(其實有點像是為了向下相容,配合其他舊程式的運作。)
    事實上,如果讓字集以自動偵測或強制使用 UTF-8,FileZilla 都能正確顯示檔案。(因為 proftpd 會如實顯示主機上的實體檔名,而 FileZilla 都能判讀。)
    但為了具備一致性,所以改成 big5 比較保險。
  3. 以其它程式上傳,例如 UltraEditor,它也是用原生字集去運作的。所以檔名也都正常。

缺點:

  1. 如果你是想跨區交換檔案,例如台灣和大陸分公司,那麼一邊用 big5,一邊用 gb2312,那一定是自找麻煩。這種情況下,應該以 utf8 方式運作才是王道。
  2. 相反的,如果你想利用utf8來解決檔名亂碼的問題,那就不能用那些老掉牙的程式來傳檔,攪亂一池春水。這時,應該以能支援 utf8 的程式或 web-based 的介面來解決檔名編碼的問題。
VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Post to Twitter Post to Plurk Post to Digg Post to Facebook

Facebook comments:

Leave a Reply

You must be logged in to post a comment.