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 可用的文件编码名.

参考资料

相关文章
相关标签/搜索