utf8编码转换脚本

jerry linux 2015年11月23日 收藏

差不多去年的这个时候吧,由于项目组的编码从GBK转向UTF-8,让我来负责转换所有的源文件,当时frank给了我一个转换的脚本,可以过滤文件类型来转换,由于是frank自己使用的工具,所以也没怎么注意容错,基本上可以理解成是对某些类型的文件使用iconv -f gbk -t utf-8 这样的命令来转换。后来发现悲剧了,原因是有一些文件已经是utf-8编码了,结果在强转了一次,就乱码了,因为只有几个文件乱码,所以一开始还没注意到,直到后来发现的时候,又得一个一个重新转回去,所以还是挺麻烦的。 最近在用一个公共组件的时候,发现其提供的都是gbk编码的,所以想着干脆还是写一个脚本来完成这件事情吧,这次吸取了上次的教训,首先会用file来判断下文件的编码是什么编码的(当前只判断gbk和utf-8),然后根据不同的类型,来设置不同的转换选项。默认只转换当前文件夹下的所有.cpp和.h文件,当然,路径和文件类型,可以分别用-f和-t的参数传进去。当然,如果你发现有什么没有考虑到的地方,还请斧正,谢谢啦。

  1. #!/bin/bash
  2.  
  3.  
  4. file_type_list="cpp h"
  5. file_path="."
  6.  
  7. #-f:文件名或者目录名 -t: 文件类型
  8. #如果不传入参数,默认目录为当前目录,默认转换文件类型为.h .cpp
  9. #example:covert_to_utf8 -f . -t "cpp h"
  10. while getopts "t:f:" arg #选项后面的冒号表示该选项需要参数
  11. do
  12. case $arg in
  13. f)
  14. echo "f's arg:$OPTARG"
  15. file_path=$OPTARG
  16. ;;
  17. t)
  18. echo "t's arg:$OPTARG"
  19. file_type_list=$OPTARG
  20. ;;
  21. ?)
  22. echo "unkonw argument"
  23. exit 1
  24. ;;
  25. esac
  26. done
  27.  
  28. echo "file_type=" $file_type_list "file_path=" $file_path
  29.  
  30.  
  31. #如果是普通文件或者目录才进行查找、转换,其他情况,不转换
  32. if [ -f $file_path -o -d $file_path ];
  33. then
  34. echo "Begin to Convert $file_path from GBK to UTF-8...."
  35. else
  36. echo " $file isn't a file or directory,can't convert! "
  37. exit;
  38. fi
  39.  
  40.  
  41. #找到普通文件,然后转换这些文件
  42. all_file=`find $file_path -type f`;
  43.  
  44. for file in $all_file;
  45. do
  46. file_type=${file##*.}
  47. #echo $file $file_type;
  48. if [[ "$file_type_list" != *"$file_type"* ]];
  49. then
  50. echo "$file_type not in $file_type_list"
  51. continue;
  52. fi
  53.  
  54. file_encoding=`file $file | awk -F : '{print $2}' | awk '{print $1}'`
  55. #GBK
  56. if [ $file_encoding == "ISO-8859" ];
  57. then
  58. original_encoding="gbk"
  59. #ASCII or UTF-8
  60. elif [ $file_encoding == "ASCII" -o $file_encoding == "UTF-8" ];
  61. then
  62. echo "$file encoding $file_encoding is ok, not need convert"
  63. continue;
  64. #未定义的编码
  65. else
  66. echo "$file error encoding $file_encoding, can't convert"
  67. continue;
  68. fi
  69. iconv -f $original_encoding -t utf-8 $file > $file"_tmp"
  70. #判断是否转换成功
  71. if [ $? != 0 ];
  72. then
  73. echo "covert $file failed!"
  74. continue;
  75. fi
  76. mv $file"_tmp" $file
  77. echo "convrt $file success!"
  78. done
  79.  
  80. echo "All file convert done!"