2012-11-23 4 views
5

저는 csv 파일을 기반으로 이미지의 이름을 바꾸고 이미지를 일괄 적으로 복사하는 스크립트 작업을하고 있습니다. csv는 1 열 : 이전 이름 ​​및 2 열 : 새 이름으로 구성됩니다. csv 파일을 perl 스크립트의 입력으로 사용하여 이전 이름을 확인하고 새 이름을 사용하여 새 폴더에 복사본을 만들려고합니다. 내가 가지고 있다고 생각하는 문제는 이미지와 관련이 있습니다. 내가 스크립트가 아웃이 인쇄 실행하면 그들은 ß 등과 같은 UTF8 문자를 포함 : Barfu├ƒg├ñsschen이 있어야 할 곳에 Barfußgässchen 다음과 같은 오류 :csv 파일을 사용하여 utf8 이름으로 이미지 복사/이름 바꾸기

Unsuccessful stat on filename containing newline at C:/Perl64/lib/File/Copy.pm line 148, <$INFILE> line 1. 
Copy failed: No such file or directory at X:\Script directory\correction.pl line 26, <$INFILE> line 1. 

나는 그것이 bin 파일 모드의 UTF8과 관련이있다 알고 있지만 나는 간단한 스크립트를 시도 할 경우에도 (여기를 보았다 : How can I output UTF-8 from Perl?) : Airth의 ÷들

이 내 전체 스크립트, 누군가가 나에게 설명 할 수 내가 갈거야 여기서

use strict; 
use utf8; 
my $str = 'Çirçös'; 
binmode(STDOUT, ":utf8"); 
print "$str\n"; 

는이를 출력 잘못된? (그 물건을 테스트했기 때문에 코드의 가장 깨끗한 것이 아닙니다).

use strict; 
use warnings; 
use File::Copy; 
use utf8; 

my $inputfile = shift || die "give input!\n"; 
#my $outputfile = shift || die "Give output!\n"; 

open my $INFILE, '<', $inputfile or die "In use/not found :$!\n"; 
#open my $OUTFILE, '>', $outputfile or die "In use/not found :$!\n"; 

binmode($INFILE, ":encoding(utf8)"); 

#binmode($OUTFILE, ":encoding(utf8)"); 

while (<$INFILE>) { 
s/"//g; 
my @elements = split /;/, $_; 

my $old = $elements[1]; 
my $new = "new/$elements[3]"; 
binmode STDOUT, ':utf8'; 
print "$old | $new\n"; 

copy("$old","$new") or die "Copy failed: $!"; 
#copy("Copy.pm",\*STDOUT); 

# my $output_line = join(";", @elements); 
# print $OUTFILE $output_line; 
#print "\n" 
} 

close $INFILE; 
#close $OUTFILE; 

exit 0; 
+0

첫 번째 스 니펫 정보 : .pl 파일 자체가 utf8로 인코딩 되었습니까? 'use utf8' pragma는 여러분의 소스 코드가 utf8로 작성되었음을 Perl에게 알려줍니다. 데이터와 관련이 없습니다. – simbabque

+0

출력을 어디에 인쇄하고 있습니까? 리눅스 쉘? 또한 파일을 어떻게 작성하고 있습니까? –

+0

LANG이'en_GB.UTF-8'으로 설정되고 퍼티가 UTF-8로 설정된 상태에서 첫 번째 스 니펫이 Linux 쉘에서 잘 작동하는지 확인할 수 있습니다. 동일한 셸에서 VIM을 사용하여 파일을 만들었습니다. –

답변

3

프로세스의 모든 단계에서 UTF-8을 사용해야합니다.

입력 CSV를 만들 때 UTF-8로 저장되어 있는지 확인해야합니다. 가능하면 BOM없이 저장해야합니다. Windows Notepad는 BOM을 추가하므로 Notepad ++ 대신 인코딩을 제어 할 수 있습니다.

Windows 콘솔이 기본적으로 UTF-8을 준수하지 않는 문제가 있습니다. Unicode characters in Windows command line - how?을 참조하십시오. chcp 65001으로 코드 페이지를 설정하거나 STDOUT 인코딩을 변경하지 마십시오.

코드와 관련하여 첫 번째 오류는 CSV의 줄 바꿈 때문일 수 있습니다. while (<$INFILE>) {

업데이트 후 chomp()를 추가

"주소"올바른 로케일에 파일 이름을 인코딩하는 데 필요한 파일을 위해 - How do you create unicode file names in Windows using PerlWhat is the universal way to use file I/O API with unicode filenames?를 참조하십시오. 당신이 서양 1,252/라틴어를 사용하는 가정이 당신의 복사 명령이 모양을 때 의미

또한
copy(encode("cp1252", $old), encode("cp1252", $new)) 

, 당신도 파일 이름 인코딩해야 열려 :

open my $INFILE, '<', encode("cp1252", $inputfile) 

업데이트 2 :

DOS 창에서 실행 중이면 binmode(STDOUT, ":utf8");을 제거하고 기본 코드 페이지를 그대로 두십시오.

+0

필자는 BOM없이 utp8로 메모장 ++에서 CSV를 만들었으므로 그렇게해서는 안됩니다. 나는 지금 나에게 준 다른 2 가지 제안을 확인하고있다. – Jan

+0

while (<$INFILE>) {'이 (가) 첫 번째 오류의 트릭을 한 후에'chomp;'를 추가했습니다. 먼저 코드 페이지를 설정 한 다음 스크립트를 다시 시도해도 아무 것도 바뀌지 않습니다. 나는 아직도 메시지 사본을 얻지 못했다. 이전 이름과 새 이름을 인쇄하면 이전 이름이 올바르지 않고 실제 파일과 일치하지 않아 실패한 것을 볼 수 있습니다. – Jan

+0

update re : filename encoding을 참조하십시오. –

관련 문제