使用 FTP 客戶端(命令列 ftp、CuteFTP、FileZilla 等)上傳中文命名的檔案/目錄至 Serv-U 服務器時,伺服器端顯示為亂碼(如「中國」變為「洩」),導致:
| 層面 | 說明 |
|---|---|
| 協議層 | 傳統 FTP 協議(RFC 959)未定義檔名編碼,預設為 ASCII/ISO-8859-1 |
| 客戶端 | Windows 客戶端常用 GBK/Big5/ANSI 編碼送出檔名;Linux 客戶端常用 UTF-8 |
| 伺服器 | Serv-U 預設以當前系統代碼頁(ANSI)解碼檔名,與客戶端編碼不匹配即產生亂碼 |
| 解決標準 | RFC 2640 定義 OPTS UTF8 ON 指令,雙端協商使用 UTF-8 編碼檔名 |
在上傳前將所有檔名/目錄名轉為 UTF-8 編碼再送出。
# Python 範例
import os
from ftplib import FTP
ftp = FTP('server')
ftp.login('user', 'pass')
ftp.sendcmd('OPTS UTF8 ON') # 明確宣告使用 UTF-8
for root, dirs, files in os.walk(local_path):
for f in files:
local_file = os.path.join(root, f)
remote_file = f.encode('utf-8').decode('utf-8') # 確保 UTF-8
with open(local_file, 'rb') as fp:
ftp.storbinary(f'STOR {remote_file}', fp)
透過停用 OPTS UTF8 指令支援,強制伺服器以系統預設編碼(ANSI)處理檔名,配合關閉「對所有路徑/檔名使用 UTF-8 編碼」選項,實現中文檔名正常顯示。
原理: 禁用 OPTS UTF8 協商,關閉 UTF-8 強制模式,Serv-U 將退回以系統 ANSI 代碼頁(中文 Windows 為 CP936/GBK)解碼檔名,與大多數中文 Windows 客戶端預設編碼一致,從而正確顯示中文。
# 客戶端上傳中文檔案
ftp> put "測試文件.txt"
# 伺服器端目錄列表應正確顯示「測試文件.txt」,而非亂碼
# 下載驗證
ftp> get "測試檔案.txt"
# 本地儲存檔名正確
若環境允許(客戶端、伺服器、檔案系統均支援 UTF-8),建議全鏈路啟用 UTF-8:
OPTS UTF8 指令lftp → set ftp:charset utf-8優勢: 徹底消除跨平台、跨語言、特殊字元(Emoji、生僻字)的編碼地獄。
| 環境 | 預設編碼 | 代碼頁 |
|---|---|---|
| 中文 Windows (簡體) | GBK | CP936 |
| 中文 Windows (繁體) | Big5 | CP950 |
| Linux/Unix/macOS | UTF-8 | — |
| Java/JVM | UTF-8 | — |
| .NET Core / .NET 5+ | UTF-8 | — |
FTP 中文亂碼源於協議未定義編碼、雙端預設編碼不一致。Serv-U 8.0 透過「禁用 OPTS UTF8 指令 + 關閉 UTF-8 強制模式」可快速適配中文 Windows 客戶端預設編碼(GBK/Big5),零改代碼解決亂碼。長遠規劃建議推動全鏈路 UTF-8 標準化,從根源消除編碼困擾。