2021-05-12 14:32:11
Linux下檔案字元編碼格式檢測和轉換
目前多數情況下, 我們遇到的非英文字元檔案都是使用UTF-8編碼的, 這時一般我們檢視這些檔案的內容都不會有問題. 不過有時, 我們有可能會遇到非UTF-8編碼的檔案, 比如中文的GBK編碼, 或者俄語的CP1251編碼. 而文字檔案一般不帶有自身編碼格式的資訊, 這就給我們處理帶來很多麻煩. 本文介紹幾個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預設為英文時, 運氣就不會那麼好了.
# 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引數來限定需要檢測的檔案語言.
首先, 我們需要看看當前系統下 enca 支援的語言和對應的編碼型別:
# 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, 於是, 我們可以嘗試以下引數組合:
# enca -L chinese test.txt
Simplified Chinese National Standard; GB2312
這時, enca 給出了一個明確的答案.
預設情況下, 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 可用的檔案編碼名.
本文永久更新連結地址:https://www.linuxidc.com/Linux/2018-06/152690.htm
相關文章