跨平台檔案傳輸 (Windows ↔ Linux) 最常遇到的編碼地雷:檔名亂碼 (GBK/Big5 vs UTF-8)、檔案內容亂碼。本文實戰演示 convmv (檔名)、iconv (內容)、Vim 內建轉換三大工具,徹底解決中文亂碼問題。
| 場景 | Windows 預設 | Linux 預設 | 衝突結果 |
|---|---|---|---|
| 檔名 | GBK (簡體) / Big5 (繁體) | UTF-8 | 中文檔名顯示亂碼、無法存取 |
| 檔案內容 | GBK/Big5/CP936 | UTF-8 | cat/vim 顯示亂碼、grep 失效 |
| 網頁資源 | GB2312/GBK | UTF-8 | URL 編碼不匹配、404 Not Found |
apt install convmv # Debian/Ubuntu
yum install convmv # RHEL/CentOS (EPEL)
pacman -S convmv # Arch
convmv -f 來源編碼 -t 目標編碼 [選項] 檔案/目錄
| 參數 | 說明 |
|---|---|
-f, --from-code | 來源編碼 (GBK, GB2312, BIG5, CP936...) |
-t, --to-code | 目標編碼 (通常 UTF-8) |
-r, --recursive | 遞歸處理子目錄 |
--notest | 真正執行重命名 (預設僅預覽) |
--list | 列出支援編碼 |
--unescap | 處理 URL 編碼 (%E4%B8%AD) |
--replace | 替換無法轉換字元 |
# 1. 預覽:將 Resources 目錄下所有檔名從 GB2312 轉 UTF-8
convmv -f GB2312 -t UTF-8 -r /Resources/
# 2. 確認無誤後執行
convmv -f GB2312 -t UTF-8 -r --notest /Resources/*
# 3. 處理 FTP/網頁 URL 編碼檔名
convmv --unescap -r --notest /var/www/html/

iconv -f 來源編碼 -t 目標編碼 輸入檔 -o 輸出檔
# 1. GBK → UTF-8 (最常見)
iconv -f GBK -t UTF-8 file_gbk.txt -o file_utf8.txt
# 2. UTF-8 → GBK (相容舊系統)
iconv -f UTF-8 -t GBK file_utf8.txt -o file_gbk.txt
# 3. Big5 → UTF-8 (繁體中文)
iconv -f BIG5 -t UTF-8 file_big5.txt -o file_utf8.txt
# 4. 批量轉換目錄下所有 .txt
for f in *.txt; do
iconv -f GBK -t UTF-8 "$f" -o "${f%.txt}_utf8.txt"
done
# 5. 忽略無法轉換字元 (加 //IGNORE 或 //TRANSLIT)
iconv -f GBK -t UTF-8//IGNORE input.txt -o output.txt
iconv -f GBK -t UTF-8//TRANSLIT input.txt -o output.txt # 近似字元替換
# file 指令偵測
file -i filename.txt
# text/plain; charset=iso-8859-1 (誤判常見)
# 更準確:uchardet
apt install uchardet
uchardet filename.txt
# UTF-8 / GB18030 / BIG5 等
# Python chardet
python3 -c "import chardet; print(chardet.detect(open('file.txt','rb').read()))"
vim ++enc=gbk filename.txt # 以 GBK 解讀開啟
vim ++enc=big5 filename.txt # 以 Big5 解讀開啟
# 在 Vim 正常模式下輸入:
:set fileencoding=utf-8 # 設定存檔編碼為 UTF-8
:w # 存檔即完成轉換
# 或指定行尾格式
:set fileformat=unix # LF
:set fileformat=dos # CRLF
:w
# 強制以 GBK 讀取,存為 UTF-8 Unix 格式
vim ++enc=gbk +"set fileencoding=utf-8 fileformat=unix" +wq filename.txt
問題:https://site/Resources/北師大/初中語文/八年級上/本冊綜合/綠.ppt 404 Not Found
原因:伺服器檔案系統 UTF-8,但 URL 含 GBK 編碼中文路徑
# 1. 檔案系統層面:convmv 修正檔名編碼
convmv -f GB2312 -t UTF-8 -r --notest /var/www/html/Resources/
# 2. Web 伺服器層面:Nginx/Apache 設定預設字符集
# Nginx
charset utf-8;
# 或針對特定目錄
location /Resources/ {
charset gbk; # 告訴瀏覽器此目錄資源編碼
}
# 3. 應用層面:統一使用 UTF-8 路徑,資料庫存儲 UTF-8
#!/bin/bash
# auto_convert.sh - 智慧偵測並轉換目錄下所有文字檔為 UTF-8
TARGET_DIR="${1:-.}"
BACKUP_DIR="${TARGET_DIR}_backup_$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
cp -r "$TARGET_DIR"/* "$BACKUP_DIR"/
find "$TARGET_DIR" -type f \( -name "*.txt" -o -name "*.csv" -o -name "*.log" -o -name "*.md" -o -name "*.html" -o -name "*.xml" -o -name "*.json" -o -name "*.conf" -o -name "*.ini" \) -print0 |
while IFS= read -r -d '' file; do
# 偵測編碼
encoding=$(uchardet "$file" 2>/dev/null || echo "unknown")
if [[ "$encoding" != "UTF-8" && "$encoding" != "ASCII" && "$encoding" != "unknown" ]]; then
echo "Converting: $file ($encoding → UTF-8)"
iconv -f "$encoding" -t UTF-8//IGNORE "$file" -o "$file.tmp" && mv "$file.tmp" "$file"
fi
done
echo "Done. Backup at $BACKUP_DIR"
| 別名/代碼頁 | 標準名稱 | 適用地區 | iconv/convmv 參數 |
|---|---|---|---|
| CP936, 936 | GBK | 簡體中文 | GBK / GB18030 |
| GB2312 | GB2312 | 簡體中文 (舊標準) | GB2312 |
| CP950, 950 | Big5 | 繁體中文 | BIG5 / BIG5-HKSCS |
| CP1252 | Windows-1252 | 西歐語言 | CP1252 |
| CP437 | IBM437 | DOS 美式 | CP437 |
| ISO-8859-1 | Latin-1 | 西歐語言 | ISO-8859-1 |
head -c 200、grep 中文 確認可讀字元編碼問題本質是編碼宣告與實際不符。convmv 解決檔名、iconv 解決內容、Vim 解決單檔即時編輯。掌握 -f/-t 指定編碼、//IGNORE 容錯、uchardet 偵測、--notest 確認執行,並建立「UTF-8 全鏈路」規範,即可從根源消除亂碼困擾。