Linux下文件字符編碼格式檢測和轉換

目前多數狀況下, 咱們遇到的非英文字符文件都是使用UTF-8編碼的, 這時通常咱們查看這些文件的內容都不會有問題. 不過有時, 咱們有可能會遇到非UTF-8編碼的文件, 好比中文的GBK編碼, 或者俄語的CP1251編碼. 而文本文件通常不帶有自身編碼格式的信息, 這就給咱們處理帶來不少麻煩. 本文介紹幾個Linux命令來檢測和轉換文本文件的編碼格式.linux

檢測文件編碼格式

enca 命令名是Extremely Naive Charset Analyser的縮寫, 從它這個賣萌的名字來看, 應該能夠用來檢測文件的編碼格式.數組

安裝 enca

在Ubuntu下, 可使用如下命令安裝測試

apt-get install enca

使用方式

它最簡單的使用方式以下:編碼

# enca test.txt
Simplified Chinese National Standard; GB2312

上面的test.txt是一個含有中文GB2312編碼的文本文件. 根據 enca 的文檔, 當咱們運氣好的時候, 就能夠按照上面不添加任何額外參數的狀況下, 檢測出文件的編碼格式. 而就個人經驗來看, Linux的語言設置是一個影響運氣的因素. 上面的操做在默認語言爲中文的Linux中, 行爲就會如同上面給出的結果正確的檢測出文件的中文編碼格式. 而當LInux默認爲英文時, 運氣就不會那麼好了..net

# enca test.txt
enca: Cannot determine (or understand) your language preferences.
Please use `-L language', or `-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run `enca --list languages' to get a list of supported languages.

根據 enca 的錯誤提示, 咱們須要給它提供-L參數來限定須要檢測的文件語言.code

首先, 咱們須要看看當前系統下 enca 支持的語言和對應的編碼類型:orm

# enca --list languages
belarusian: CP1251 IBM866 ISO-8859-5 KOI8-UNI maccyr IBM855 KOI8-U
 bulgarian: CP1251 ISO-8859-5 IBM855 maccyr ECMA-113
     czech: ISO-8859-2 CP1250 IBM852 KEYBCS2 macce KOI-8_CS_2 CORK
  estonian: ISO-8859-4 CP1257 IBM775 ISO-8859-13 macce baltic
  croatian: CP1250 ISO-8859-2 IBM852 macce CORK
 hungarian: ISO-8859-2 CP1250 IBM852 macce CORK
lithuanian: CP1257 ISO-8859-4 IBM775 ISO-8859-13 macce baltic
   latvian: CP1257 ISO-8859-4 IBM775 ISO-8859-13 macce baltic
    polish: ISO-8859-2 CP1250 IBM852 macce ISO-8859-13 ISO-8859-16 baltic CORK
   russian: KOI8-R CP1251 ISO-8859-5 IBM866 maccyr
    slovak: CP1250 ISO-8859-2 IBM852 KEYBCS2 macce KOI-8_CS_2 CORK
   slovene: ISO-8859-2 CP1250 IBM852 macce CORK
 ukrainian: CP1251 IBM855 ISO-8859-5 CP1125 KOI8-U maccyr
   chinese: GBK BIG5 HZ
      none:

在個人測試環境中, enca 支持以上的語言和編碼. 能夠看到中文是chinese: GBK BIG5 HZ, 因而, 咱們能夠嘗試如下參數組合:ip

# enca -L chinese test.txt
Simplified Chinese National Standard; GB2312

這時, enca 給出了一個明確的答案.rem

默認狀況下, enca 給出的是人可讀的編碼格式名, 好比上面的 Simplified Chinese National Standard; GB2312. 而有時, 咱們會但願給出的結果給其餘命令或者程序使用, 好比, 咱們但願結合 iconv 命令來轉換文件編碼, 能夠添加-i來讓 enca 給出相應的程序可用編碼名:文檔

# enca -i -L chinese test.txt
GBK

轉換文件編碼格式

在知道了文件的正確編碼格式以後, 咱們每每會但願將文件轉換爲UTF8之類經常使用或者系統默認支持的編碼格式, 以便後續進一步處理.

使用 enca 進行轉換

當咱們給 enca 命令添加-x參數時, enca 命令就會將文件轉換爲-x參數指定的編碼格式:

# enca -L chinese test.txt
Simplified Chinese National Standard; GB2312
# enca -x UTF8 -L chinese test.txt
# enca -L chinese test.txt
Universal transformation format 8 bits; UTF-8

能夠看到, 在執行enca -x UTF8 -L chinese test.txt命令後, 文件 test.txt 的編碼從GB2312轉換爲了UTF8. 注意 , enca 命令會將源文件覆蓋, 因此使用這個命令時, 要注意備份源文件.

使用 iconv 進行轉換

iconv 是*nix系統裏的轉換字符編碼的標準命令和API. 若是咱們但願將一個GBK編碼的文件轉換爲UTF8編碼, 能夠以如下方式使用 iconv 命令:

# iconv -f GBK -t UTF8 test.txt

其中test.txt是要被轉換的文件, -f GBK參數表示源文件的編碼是GBK, -t UTF8則表示要轉換的目標編碼. 執行以上命令後, iconv 命令會將轉換後的文件內容打印到標準輸出.

若是但願將轉換後的內容保存到文件, 能夠添加-o參數:

# iconv -f GBK -t UTF8 -o test_converted.txt test.txt

這個命令就會將轉換後的內容自動保存到 test_converted.txt 文件.

經過 iconv -l則能夠查看全部的字符集名稱. 前文也提到enca -i則能夠用來輸出 iconv 可用的文件編碼名.

參考資料

相關文章
相關標籤/搜索