Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux 批量將 UTF-8 編碼轉換為 GB2312 的完整指南

編輯:關於 Linux

在 Linux 環境下,若直接使用 sqlplus 匯入 UTF-8 編碼的 SQL 腳本,常會因編碼不匹配導致亂碼與錯行。逐個手動轉換檔案極其繁瑣,本文將教你如何編寫 Shell 腳本,一次完成所有 .sql 檔案從 UTF-8 到 GB2312 的批次轉換,並妥善處理 UTF-8 BOM 標記與行尾換行符。

問題背景

使用 Oracle sqlplus 批量匯入 UTF-8 編碼的 SQL 腳本時,若未正確設定客戶端編碼,資料庫會誤讀字元而產生亂碼。因檔案數量龐大,手動以編輯器另存為 GB2312 根本不可行,故需自動化腳本解決。

核心轉換腳本

以下腳本會遞迴尋找當前目錄下所有 *.sql 檔案,依序處理:

#!/bin/bash
# 批次將 *.sql 從 UTF-8 轉為 GB2312,並統一行尾為 CRLF (Windows 風格)

for file in $(find . -type f -name "*.sql" -print); do
    echo "處理: $file"
    mv -f "$file" "$file.tmp"
    dos2unix "$file.tmp" 2>/dev/null   # 先統一為 LF,避免干擾 BOM 偵測

    # 檢查第一行是否含有 UTF-8 BOM (EF BB BF)
    head -c 3 "$file.tmp" | od -t x1 | grep -q "ef bb bf"
    if [ $? -eq 0 ]; then
        echo "偵測到 UTF-8 BOM"
        # 移除前 3 位元組 BOM
        tail -c +4 "$file.tmp" > intermediate.txt
        iconv -f UTF-8 -t GB2312 -o "$file" intermediate.txt
        rm -f intermediate.txt
    elif iconv -f UTF-8 -t GB2312 "$file.tmp" >/dev/null 2>&1; then
        echo "偵測到無 BOM 的 UTF-8"
        iconv -f UTF-8 -t GB2312 -o "$file" "$file.tmp"
    else
        echo "非 UTF-8 編碼 (推測為 ANSI/GB2312),保持原樣"
        mv -f "$file.tmp" "$file"
    fi

    # 模擬 unix2dos:將 LF 轉為 CRLF,方便 Windows 下檢視
    sed 's/$/\r/' "$file" > "$file.tmp"
    mv -f "$file.tmp" "$file"
done

關鍵步驟解析

  1. BOM 偵測與移除:UTF-8 BOM 為十六進位 EF BB BF。腳本用 head -c 3 讀取前三位元組,配合 od 與 grep 判斷;若存在,以 tail -c +4 截除後再轉碼。
  2. 編碼嘗試轉換:對無 BOM 檔案,直接嘗試 iconv -f UTF-8 -t GB2312;成功即為 UTF-8,失敗則視為已是 GB2312 (或相容編碼) 而不處理。
  3. 行尾統一:因目標環境為 Windows,腳本末端以 sed 's/$/\r/' 將所有行尾 LF (\n) 補上 CR (\r),形成 CRLF。

使用提醒

  • 執行前請備份原始檔案,轉換為不可逆操作。
  • 確認系統已安裝 iconv、dos2unix、sed 等工具。
  • 若檔案編碼非 UTF-8 也非 GB2312 (如 Big5),腳本會保持原樣,需另行處理。

掌握此腳本,即可輕鬆解決大量 SQL 腳本的編碼遷移問題,大幅提升運維效率。

Copyright © Windows教程網 All Rights Reserved