iconv 文字編碼轉換 文章首圖

iconv 文字編碼轉換

iconv 文字編碼轉換

在 Linux 系統管理與開發的日常工作中,我們經常會遇到跨平台或跨語言帶來的文字編碼問題。當我們從 Windows 環境匯入 CSV 檔案、處理來自中國大陸的 GBK 編碼資料,或是處理日文系統的 Shift_JIS 檔案時,若未正確設定編碼,終端機或應用程式往往會顯示亂碼。這時,iconv 這個強大的文字編碼轉換工具就顯得尤為重要。作為 Linux 世界中處理字元編碼的標準工具之一,iconv 不僅功能強大,而且幾乎在所有發行版中都預設安裝。這篇文章將深入解析 iconv 的用法,幫助你輕鬆解決編碼困擾。

基本語法與核心選項

iconv 的核心邏輯非常直觀:指定來源編碼(-f)與目標編碼(-t),然後輸入檔案或標準輸入,最後輸出轉換後的結果。其基本語法如下:

iconv -f [來源編碼] -t [目標編碼] [輸入檔案] > [輸出檔案]

其中,-f 代表 from(來源),-t 代表 to(目標)。若省略檔案路徑,iconv 會預設讀取標準輸入(stdin),這使得它可以無縫串接在其他指令管道中。

常見場景與實際範例

1. UTF-8 與 GBK 的相互轉換

這是台灣與大陸開發者最常遇到的情境。許多舊版的 Windows 軟體(如 Excel)在中國大陸預設使用 GBK 編碼儲存檔案,而 Linux 系統通常使用 UTF-8。

假設我們有一個名為 data_gbk.txt 的檔案,內容為 GBK 編碼。我們想將其轉換為 UTF-8:

iconv -f GBK -t UTF-8 data_gbk.txt > data_utf8.txt

反之,若需將 UTF-8 檔案轉換回 GBK:

iconv -f UTF-8 -t GBK data_utf8.txt > data_gbk.txt

指令輸出示範:

$ cat data_utf8.txt
你好世界
$ iconv -f UTF-8 -t GBK data_utf8.txt > data_gbk.txt
$ file data_gbk.txt
data_gbk.txt: Non-ISO extended-ASCII text, with no line terminators

2. 處理 Windows 的 Big5 與 ANSI

在台灣,Windows 的預設編碼通常是 Big5。當我們從 Windows 匯入文字檔時,常需將其轉換為 Linux 通用的 UTF-8。

iconv -f BIG5 -t UTF-8 windows_file.txt > linux_file.txt

需要注意的是,iconv 支援的編碼名稱可能因系統而異。若 BIG5 無法識別,可嘗試 BIG5-HKSCSCP950

3. 使用管道進行即時轉換

iconv 的最大優勢在於其對標準輸入/輸出的支援。這意味著你可以將其整合到腳本中,進行即時編碼轉換,而無需建立中間檔案。例如,將 GBK 檔案的內容直接透過 mail 指令寄出,或透過 grep 搜尋:

# 將 GBK 檔案轉換為 UTF-8 後,直接搜尋包含「錯誤」的行
iconv -f GBK -t UTF-8 log.txt | grep "錯誤"

進階選項:處理無法轉換的字元

在編碼轉換過程中,最常遇到的問題是「某些字元在目標編碼中不存在」。例如,將 UTF-8 轉換為 ASCII 時,中文字符號無法表示。這時,iconv 提供了一個關鍵選項:-c(ignore)。

若不加 -c,當遇到無法轉換的字元時,iconv 會停止執行並回報錯誤:

$ iconv -f UTF-8 -t ASCII test.txt
iconv: illegal input sequence at position 0

加上 -c 選項後,iconv 會靜默忽略無法轉換的字元,繼續處理後續內容:

$ iconv -f UTF-8 -t ASCII -c test.txt > output.txt
$ cat output.txt

這個選項對於批量處理大量雜亂資料時非常實用,但請務必謹慎使用,因為這可能會導致資料遺失。

常見問題與解決方案

Q1: 如何確認系統支援哪些編碼?

若你不確定某個編碼名稱是否正確,可以查詢 iconv 支援的編碼列表:

iconv -l

這將列出所有支援的編碼名稱。例如,你會看到 UTF-8GBKISO-8859-1 等。若使用簡寫名稱失敗,可嘗試查詢完整名稱。

Q2: 轉換後檔案出現亂碼,怎麼辦?

亂碼通常由以下原因造成:

  1. 編碼猜測錯誤:確認來源編碼是否正確。可使用 file -i filename 指令來輔助判斷檔案的 MIME 類型與編碼。
  2. BOM 問題:Windows 產生的 UTF-8 檔案常帶有 BOM(Byte Order Mark)。若轉換後仍有問題,可嘗試使用 iconv -f UTF-8-BOM -t UTF-8
  3. 行結尾符號:Windows 使用 CRLF(\r\n),Linux 使用 LF(\n)。若需同時轉換行結尾,建議搭配 dos2unix 指令使用。

小結

iconv 是 Linux 系統中處理文字編碼的瑞士刀。透過熟練掌握 -f-t-c 等選項,並善用管道串接,你可以輕鬆應對各種跨平台文字交換的需求。無論是處理 GBK、Big5 還是其他特殊編碼,iconv 都能提供穩定且高效的解決方案。建議在日常工作中養成檢查檔案編碼的習慣,並善用 file -i 輔助判斷,讓資料處理更加順暢。