批量文件编码格式转化
前言
前段时间帮别人调试程序,在windows下能正常显示的输出,在linux下输出的全是乱码?后来发现windows默认的文件编码而是GB2312,而linux下的文件默认是utf-8,所以导致了这个问题。另一个问题就是用source insight看源码的问题,对windows下的文本文件都能看的中文源码注释,在si中居然是乱码,后来发现si居然不支持utf-8,一个这么通用的utf-8它居然不支持,这真是让si这个看代码神奇大打折扣了。今天遇到个问题就是如果我用si编写中午注释,然后将源文件上传到github上,可github上确显示的是乱码,即使调整网页的编码也不能解决,也就是说github上默认的网页编码格式是utf-8,而si中文件的编码格式是gb2312。
解决
在网上看了下,有人给si写了个插件,能看utf-8格式的文件,结果我试了确不是,不知道是不是我的配置有问题。另外就是将utf-8格式的文件转换为gb2312格式的文件,这个在linux中有现成的工具,那就是iconv,使用方法如下:
iconv -f gb18030 -t utf-8 file1.txt -o file2.txt
-f表示待转文件的源编码格式,-t表示待转文件的目标编码格式,file1.txt表示待转文件路径,-o指定目标文件路径。可以看出,这个工具使用起来很简单,不过就是不能成批的转换一个目录中的所有文件,所以我就在这个基础之上用shell脚本写了个成批转某个目录中的所有文件的编码格式,这个工具的使用语法和iconv差不多,具体如下:
myiconv -f gb18030 -t utf-8 test/
这个工具只需要指定需要转换的目标路径(最好是绝对路径)就可以了。工具只能将源代码文件,如.c,.h,.cpp,.cc文件的格式进行转换,如果要支持更多的文件类型,可以直接自己修改。源码链接地址:https://github.com/cc1989/my_shell.git,主要代码如下:
foreachd() { for file in $1/* do if [ -d "$file" ] then echo "进入$file" foreachd "$file" elif [ -f "$file" ] then #过滤掉一些不需要转换的文件 #want_file="`echo $file | sed -n \"/.*\.\(tar\|gz\|z\|bz2\|gzip\|so\|o\|a\|pdf\|lo\|sln\)$/p\"`" #只对源文件进行修改 want_file="`echo $file | sed -n \"/.*\.\(c\|cc\|cpp\|h\|cxx\)$/p\"`" #echo $want_file if [ $want_file ] then echo "转换$file" iconv -f $source_type -t $dest_type $file -o $file.b if [ $? -eq 0 ] then rm "$file" mv "$file.b" "$file" else echo "$file转换失败" fi fi fi done }