批量文件编码格式转化

前言

  前段时间帮别人调试程序,在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
}

测试

原文地址:https://www.cnblogs.com/chengxuyuancc/p/3735394.html