텍스트를 UTF-8로 변환하는 여러 가지 방법을 보았지만 모두 현재 사용 중인 텍스트 인코딩을 지정해야 합니다.
이전에 어떤 용도로 사용되었는지 신경 쓰지 않고 여러 파일을 UTF-8로 일괄 변환하는 방법이 있습니까?
답변1
이것은 어려운 질문이지만 제가 꽤 자주 접하는 질문입니다. 저는 다양한 접근 방식을 사용하여 일련의 스크립트를 만들었습니다. 간단한 스크립트를 보여드리겠습니다(유럽 라틴 환경에서 utf8 보장).
- 각 파일에 대해 해당 유형과 문자 세트를 요청하십시오(
file -i
). - 일반적인 상황을 처리하고 백업을 유지하는 방법을 결정합니다.
- 많은 경우...아무 것도 하지 마십시오!
- 경우에 따라 기본값을 사용합니다(예제에서는 CP1252/latin1)
#!/usr/bin/perl
use strict;
my $charset;
for(@ARGV){
$charset="?";
next if /.bak$/;
my $type = `file -b -i '$_'`; ### use file -i for charset and type
if($type =~ /(\S+);\s+charset=(\S+)/){$type=$1; $charset=lc($2)};
next if($charset eq "utf-8") ;
next if($charset eq "binary") ;
next if($charset eq "us-ascii") ;
next if($type eq "application/postscript");
if($type eq "application/xml"){
rename($_ ,"$_.bak");
system ("xmllint --encode utf-8 '$_.bak' > '$_'\n") }
elsif($charset eq "non-iso" or $charset eq "unknown-8bit" ) {
rename($_ ,"$_.bak");
system ("iconv -f CP1252 -t utf-8 '$_.bak' > '$_'\n") } ## DANGER
elsif($charset eq "utf-16le"){
rename($_ ,"$_.bak");
system ("iconv -f $charset -t utf-8 '$_.bak' > '$_'\n") }
elsif($charset eq "iso-8859" or $charset eq "iso-8859-1"){
rename($_ ,"$_.bak");
system ("iconv -f latin1 -t utf-8 '$_.bak' > '$_'\n") }
else { print "HELP: '$type:$charset' '$_'\n"; }
}
이는 일반적인 도구는 아니지만 자신만의 경험적 방법을 구현하기 위한 시작점으로 도움이 될 수 있습니다.