Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1813208
  • 博文数量: 274
  • 博客积分: 2366
  • 博客等级: 大尉
  • 技术积分: 1880
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-22 09:37
文章分类

全部博文(274)

文章存档

2022年(1)

2020年(10)

2019年(7)

2018年(18)

2017年(26)

2016年(32)

2015年(43)

2014年(30)

2013年(44)

2012年(36)

2011年(17)

2010年(10)

分类: LINUX

2016-04-11 12:06:57

utf8编码转换脚本
  差不多去年的这个时候吧,由于项目组的编码从GBK转向UTF-8,让我来负责转换所有的源文件,当时frank给了我一个转换的脚本,可以过滤文件类型来转换,由于是frank自己使用的工具,所以也没怎么注意容错,基本上可以理解成是对某些类型的文件使用iconv -f gbk -t utf-8 这样的命令来转换。后来发现悲剧了,原因是有一些文件已经是utf-8编码了,结果在强转了一次,就乱码了,因为只有几个文件乱码,所以一开始还没注意到,直到后来发现的时候,又得一个一个重新转回去,所以还是挺麻烦的。

    最近在用一个公共组件的时候,发现其提供的都是gbk编码的,所以想着干脆还是写一个脚本来完成这件事情吧,这次吸取了上次的教训,首先会用file来判断下文件的编码是什么编码的(当前只判断gbk和utf-8),然后根据不同的类型,来设置不同的转换选项。默认只转换当前文件夹下的所有.cpp和.h文件,当然,路径和文件类型,可以分别用-f和-t的参数传进去。当然,如果你发现有什么没有考虑到的地方,还请斧正,谢谢啦

#!/bin/bash


file_type_list="cpp h"
file_path="."

#-f:文件名或者目录名  -t: 文件类型
#如果不传入参数,默认目录为当前目录,默认转换文件类型为.h .cpp
#example:covert_to_utf8 -f . -t "cpp h"
while getopts "t:f:" arg #选项后面的冒号表示该选项需要参数
do
   case $arg in
       f)
           echo "f's arg:$OPTARG"
           file_path=$OPTARG
           ;;
       t)
           echo "t's arg:$OPTARG"
           file_type_list=$OPTARG
           ;;
       ?)
           echo "unkonw argument"
           exit 1
           ;;
   esac
done

echo "file_type=" $file_type_list "file_path=" $file_path


#如果是普通文件或者目录才进行查找、转换,其他情况,不转换
if [  -f $file_path  -o  -d $file_path  ];
then
   echo "Begin to Convert $file_path from GBK to UTF-8...."
else
   echo " $file isn't a file or directory,can't convert! "
   exit;
fi


#找到普通文件,然后转换这些文件
all_file=`find $file_path -type f`;

for file in $all_file;
do
   file_type=${file##*.}
   #echo $file $file_type;
   if [[ "$file_type_list" != *"$file_type"* ]];
   then
       echo "$file_type not in $file_type_list"
       continue;
   fi
   
   file_encoding=`file $file | awk -F : '{print $2}' | awk '{print $1}'`
   #GBK
   if [ $file_encoding == "ISO-8859" ];
   then
       original_encoding="gbk"
   #ASCII or UTF-8
   elif [ $file_encoding == "ASCII" -o $file_encoding == "UTF-8" ];
   then
       echo "$file encoding $file_encoding is ok, not need convert"
       continue;
   #未定义的编码
   else
       echo "$file error encoding $file_encoding, can't convert"
       continue;
   fi
   iconv -f $original_encoding -t utf-8 $file > $file"_tmp"
   #判断是否转换成功
   if [ $? != 0 ];
   then
       echo "covert $file failed!"
       continue;
   fi
   mv $file"_tmp" $file
   echo "convrt $file success!"
done

echo "All file convert done!"
阅读(1040) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~