Linux下对文件进行编码转换
2009-12-13 20:14
190 查看
http://bbs.lpi-china.org/viewthread.php?tid=2912
其实说到编码转换,那就不得不说到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的文件比对其进行编码转换。
在上面的程序中,为了说明方便,文件编码和转换的目标编码都是在程序里设定的,如果需要更加实用一点的话,可以把原文件的编码和转换的目标编码都作为参数来输入,这样的话,这个程序就不光是中文系统下的文件编码转换了,日文,韩文等等编码的转换也能很轻松实现了。
其实说到编码转换,那就不得不说到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的文件比对其进行编码转换。
在上面的程序中,为了说明方便,文件编码和转换的目标编码都是在程序里设定的,如果需要更加实用一点的话,可以把原文件的编码和转换的目标编码都作为参数来输入,这样的话,这个程序就不光是中文系统下的文件编码转换了,日文,韩文等等编码的转换也能很轻松实现了。
相关文章推荐
- linux之中对文件名和文件进行编码转换
- 在Linux中查看文件的编码及对文件进行编码转换
- 在Linux下对文件进行编码转换(简体→繁体,繁体→简体,简体繁体→UTF-8)
- Linux 对文件进行编码转换
- Linux中使用iconv命令对文件进行编码转换
- linux之中对文件名和文件进行编码转换
- Linux查看文件编码格式及文件编码转换
- Linux查看文件编码格式及文件编码转换
- linux系统下对各文件进行打包或解压
- Linux下多个进程或线程同时对一个文件进行写操作
- linux之间进行文件共享
- Linux 中 的 vi 编辑模式 直接对文件进行修改~
- apt-sortpkgs命令_Linux apt-sortpkgs 命令用法详解:Debian Linux下对软件包索引文件进行排序的工具
- Linux学习23_使用ll命令和chown命令对文件拥有者进行指定或修改
- 利用xShell 与linux进行文件互传
- Linux查看文件编码格式及文件编码转换
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- Linux_搭建Samba服务_进行文件的传输(简单版)
- Linux 下用shell脚本对SVN 修改的文件进行备份
- Linux下多个进程或线程同时对一个文件进行写操作和access函数