在Linux下对文件进行编码转换(简体→繁体,繁体→简体,简体繁体→UTF-8)

 

其实说到编码转换,那就不得不说到iconv这个库了,如果已经安装了这个工具,那在命令行下直接打这个命令就行了。下面就用这个工具来实现中文系统下的常用编码转换。

 

首先,来了解一下iconv这个命令的使用方法。命令格式如下

iconv -f 编码 -t 编码 文件名

-f 参数指所要转换文件的文件编码,当然必须事先知道文件的编码,不然不能正确转换。

-t 参数指希望转换成的文件编码,当然应该知道所指定文件的编码能不能转换成该编码,不然转换后的结果可能一无所用。比如你将中文编码转换成西欧的某种编码的话,是没有什么意义的。

文件名 就是你希望转换的文件的名称的,当然也可以包含路径了。

 

比如将a.txt文件用GB2312(简体)转换成BIG5(繁体),命令如下:

$iconv -f GB2312 -t BIG5 a.txt

 

当然也可以使用iconv -l来查看都有哪些编码可用,命令如下:

$iconv -l

 

那么,如果不知道文件的编码怎么办?比如我的系统中有繁体字编码的文件,也有UTF-8编码的文件,又有简体字编码的文件,但是系统说使用的编码是简体的。怎样把所有文件的编码都转换成简体字,或者怎样将所有文件的编码变成繁体字编码,或者怎样将所有的文件都转换成UTF-8编码呢?下面的这段程序将告诉你去怎样实现这个功能。

 

# ! / bin / bash

# 文件名
fname
=$ 1
# 临时文件,用来保存转换的结果
tmpfile
= " cc`date +%0H%0M%0S`.liu "
# 没有输入文件名
if  [ -z  $ {fname} ]  ;   then
    
echo   " Bad file name.  " ;
    
exit ;
fi
# 输入的文件不存在
if  [ ! -f  $ {fname} ]  ;   then
    
echo   " File is not existed.FILE= " $ {fname} ;
    
exit ;
fi
################################################
#  f_code:现有文件的编码,当不太清楚现有文件的编码的时候,
#         可以同时指定的几种可能的编码
#  t_code:希望转换成的目标编码
################################################
# 比如要将GB2312或者UTF-8的文件转换成BIG5(繁体)文件
t_code
= " BIG5 "      # 目标编码
f_code
= " GB2312 UTF-8 "      # 可以转换的文字编码

# 判断系统文字编码是否为GB2312,是的话则将BIG5或者UTF-8编码的文件转换成系统一样
# 的GB2312
echo   $ LANG | grep -i GB2312 >   / dev / null
if  [  $ ? -eq  0  ]  ;   then
    t_code
= " GB2312 "      # 目标编码
    f_code
= " BIG5 UTF-8 "      # 可以转换的文字编码
fi

# 判断系统文字编码是否为BIG5 ,  是的话则将GB2312或者UTF-8编码的文件转换成系统一样
# 的GB2312
echo   $ LANG | grep -i BIG5  >   / dev / null
if  [  $ ? -eq  0  ]  ;   then
    t_code
= " BIG5 "      # 目标编码
    f_code
= " GB2312 UTF-8 "      # 可以转换的文字编码
fi
# 如果要把GB2312 , BIG5文字编码的文件统一转换成UTF- 8 , 则应该这样
t_code
= " UTF-8 "      # 目标编码
f_code
= " GB2312 BIG5 "      # 可以转换的文字编码

# 当然你也可以任意设置你需要互相转换的编码,但主意要保证编码之间可以自由转换。比如
# 你要将GB2312转换成某种西欧编码,则没有什么意义了。
normal_msg
= ""
error_msg
= ""
# 依次尝试从可以转换的文字编码开始对文件进行编码转换
for  code in  $ {f_code}  ;   do
    
# 文字编码转换
    iconv -f 
$ code -t  $ t_code  $ {fname}  >   $ {tmpfile}
    
# 转换成功,一旦转换成功则不用再尝试用其他编码来读取文件
    
if  [  $ ? -eq  0  ]  ;   then
        normal_msg
= " ICONV SUCCESSED! FILENAME=${fname} F_CODE=$code,T_CODE=$t_code "
        
break
    
else      # 转换失败
        
if  [ ! -z  " ${error_msg} "  ]  ;   then
            error_msg
= " ${error_msg}  "
        fi
        error_msg
= " ${error_msg}ICONV FAILED! FILENAME=${fname} F_CODE=$code,T_CODE=$t_code "
    fi
done
# 输出转换结果消息
# 转换成功,则输出转换成功消息;所有尝试转换都失败的时候,则输出所有转换失败消息
if  [ -z  " ${normal_msg} "  ]  ;   then
    
echo  -e  $ {error_msg}
else
    cp -f 
$ {tmpfile}  $ fname
    
echo   $ {normal_msg}
fi

# 删除临时文件
if  [ -f  $ {tmpfile} ]  ;   then
    rm -f 
$ {tmpfile} ;
fi

 

 

在上面的程序中,实际上只是实现了一个文件的转换,如果要实现多个文件的转换的话,该怎么办了,其实很简单了,只需要遍历一下文件就行了。遍历文件的方法很多,也就不详细解说了,下面仅举一个用find命令来查找文件并对找到的文件进行编码转换。命令很简单,如下:

$find . -type f -name ‘*.txt’ | xargs -l sh cc.sh

 

其中cc.sh是上面的程序文件。该命令查找当前目录下所有的后缀为txt的文件比对其进行编码转换。

 

在上面的程序中,为了说明方便,文件编码和转换的目标编码都是在程序里设定的,如果需要更加实用一点的话,可以把原文件的编码和转换的目标编码都作为参数来输入,这样的话,这个程序就不光是中文系统下的文件编码转换了,日文,韩文等等编码的转换也能很轻松实现了。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值