---恢复内容开始---
有四五天没写博客了,实在没内容写了,最近在写一个sgml东东,转码问题让我很是头疼!!!整理了一下所有转码方法,虽然最后也没成功吧,可能是系统设置的问题!
方法1
enca用法如下:
enca -L zh_CN file 检查文件的编码
enca -L zh_CN -x UTF-8 file 将文件编码转换为"UTF-8"编码
enca -L zh_CN -x UTF-8 file1 file2 如果不想覆盖原文件可以这样
除了有检查文件编码的功能以外,”enca”还有一个好处就是如果文件本来就是你要转换的那种编码,它不会报错,还是会print出结果来, 而”iconv”则会报错。这对于脚本编写是比较方便的事情。
转换单个文件的编码
enca -L none -x utf-8 index.html
方法2
通过iconv这个命令,通过file -i filename 或 则 file filename 检查文件的编码
iconv -f 原编码 -t 目的编码 文件名 转碼后会把文件内容输入到终端
iconv -f 原编码 -o 目的编码 文件名 不会把转碼的内容输入到终端,
方法3
递归转换(包括子文件夹)
find default -type d -exec mkdir -p utf/{} \;
find default -type f -exec iconv -f GBK -t UTF-8 {} -o utf/{} \;
这两行命令将default目录下的文件由GBK编码转换为UTF-8编码,目录结构不变,转码后的文件保存在utf/default目录下。
注意:如果原来就是utf-8编码,使用iconv -f GBK -t UTF-8命令转换后,会出现乱码,或截断等各种问题;
一定要保证原文件是不是utf-8编码;
使用如下命令把文件编码先查出来:
find default -type f -exec file -i {} \; > /tmp/a
查询是否存在已经是utf-8编码的文件:
grep "charset=utf-8" /tmp/a
方法4
比如一下文件起名叫做encondoinU2G.pl
# convert all sgml files from UTF8 to GBK
use strict;
use autodie;
use File::Copy;
use encoding "utf8";
use encoding "gbk";
my $sourceDir = "源文件路径1";
my $targetDir = "相对于源文件目录下一个存放转码后的路径";
sub process
{
(my $sourceFile,my $targetFile)=@_;
#print STDERR "$sourceFile\n";
if (-d $sourceFile){
mkdir $targetFile unless (-d $targetFile);
my $handle;
if (opendir($handle, $sourceFile)) {
while (my $subpath = readdir($handle)) {
if (!($subpath =~ m/^\.$/) and !($subpath =~ m/
^(\.\.)$/)) {
my $sourceF = $sourceFile."/$subpath";
my $targetF = $targetFile."/$subpath";
process($sourceF,$targetF);
}
}
}
closedir($handle);
}elsif($sourceFile =~ /.sgml$/){
open(FIN, "<:encoding(utf8)",$sourceFile);# or die $!;
open(FOUT, ">:encoding(gbk)",$targetFile);# or die $!;
while(<FIN>) {
print FOUT $_;
}
close(FIN);
close(FOUT);
}else{
copy $sourceFile,$targetFile ;
}
}
process $sourceDir,$targetDir ;
执行perl encondoinU2G.pl
这个脚本可以批量转码,而且扩展性也很強!
---恢复内容结束---