使用 iconv 自动判断文件编码

做项目的时候,文件编码为UTF-8,需要临时转码到GBK,开始的时候用 iconv 来转换,很简单。不久之后,项目扩大,需要处理 源代码为 GBK 的文件,当一个GBK的文件被拿给 iconv 做转换的时候,如果这个文件本身是GBK编码,就会报错,终止整个shell自动处理流程。为什么会这样呢?
因为:
iconv -f UTF-8 -t GBK file.nameiconv 的调用命令强制用户输入 -f 参数,即原始文件编码,如果文件不是该编码,则会报错:
iconv: illegal input sequence at position 0在google上找了下,发现大家都似乎使用同一个解决方案:enca
我不太喜欢为了这么简单的事情再安装一个包,并且,经过我的查找,在项目使用的cygwin平台,也没有这个包可以装,那么,这个问题在只有 iconv 的情况下就不能解决么?
当然是可以解决的,到目前为止,这个项目只涉及到2种文件编码,所以我们可以轮询一下:
iconv -f utf8 file.name 1>/dev/null 2>/dev/null && echo 1
iconv -f gbk file.name 1>/dev/null 2>/dev/null && echo 2
或者干脆把是否该编码包装成一个函数:
isEnc () {
  local temp=`iconv -f $2 $1 1>/dev/null 2>/dev/null && echo 'true'`;
  if [ "$temp" = 'true' ]; then
    return 0;
  fi;
  return -1;
}
像这样使用:
isEnc file.name utf8 && echo 'file is utf8'
isEnc file.name gbk && echo 'file is gbk'
所以,谁说 iconv 不能做文件编码类型识别呢?当然,还做不到自动识别文件的编码类型,但是可以询问一个文件是否某指定编码类型(网上传的很多的 enca 似乎也只能做到这一步,使用 enca -L zh_CN file 这样的参数)
将 nerdy 进行到底!! stauren.net 就是一个 nerdy blog!! we are jerks, we are geeks, we are nerds!!!!

你可能感兴趣的:(使用 iconv 自动判断文件编码)