萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 字元編碼轉換實戰:convmv、iconv、Vim 解決亂碼三大神器

跨平台檔案傳輸 (Windows ↔ Linux) 最常遇到的編碼地雷:檔名亂碼 (GBK/Big5 vs UTF-8)、檔案內容亂碼。本文實戰演示 convmv (檔名)、iconv (內容)、Vim 內建轉換三大工具,徹底解決中文亂碼問題。

編碼地雷成因

場景Windows 預設Linux 預設衝突結果
檔名GBK (簡體) / Big5 (繁體)UTF-8中文檔名顯示亂碼、無法存取
檔案內容GBK/Big5/CP936UTF-8cat/vim 顯示亂碼、grep 失效
網頁資源GB2312/GBKUTF-8URL 編碼不匹配、404 Not Found

工具一:convmv — 檔名/目錄名批量編碼轉換

安裝


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/

convmv 轉換示意

工具二:iconv — 檔案內容編碼轉換

語法


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 內建編碼轉換

開啟時指定編碼


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, 936GBK簡體中文GBK / GB18030
GB2312GB2312簡體中文 (舊標準)GB2312
CP950, 950Big5繁體中文BIG5 / BIG5-HKSCS
CP1252Windows-1252西歐語言CP1252
CP437IBM437DOS 美式CP437
ISO-8859-1Latin-1西歐語言ISO-8859-1

最佳實踐原則

  1. 源頭統一:開發/儲存階段強制 UTF-8 (編輯器、IDE、資料庫、版控)
  2. 邊界轉換:只在與舊系統介接時轉換,內部全程 UTF-8
  3. 檔名不含中文:生產系統檔名建議僅用 ASCII (英文、數字、底線、連字號)
  4. 備份優先:任何批量轉換前完整備份
  5. 驗證機制:轉換後抽樣 head -c 200、grep 中文 確認可讀

小結

字元編碼問題本質是編碼宣告與實際不符。convmv 解決檔名、iconv 解決內容、Vim 解決單檔即時編輯。掌握 -f/-t 指定編碼、//IGNORE 容錯、uchardet 偵測、--notest 確認執行,並建立「UTF-8 全鏈路」規範,即可從根源消除亂碼困擾。

copyright © 萬盛學電腦網 all rights reserved