사용된 인코딩을 미리 알지 못한 채 텍스트를 UTF-8로 인코딩하는 방법은 무엇입니까?

사용된 인코딩을 미리 알지 못한 채 텍스트를 UTF-8로 인코딩하는 방법은 무엇입니까?

텍스트를 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"; }
}

이는 일반적인 도구는 아니지만 자신만의 경험적 방법을 구현하기 위한 시작점으로 도움이 될 수 있습니다.

관련 정보