2013-07-20 2 views
0

현재 아시아 문자 (중국어 간체 및 번체 모두)가있는 특정 페이지를 긁기위한 작은 perl 스크립트를 작성하고 있습니다. 내가 직면 한 첫 번째 문제는 Mechanize를 사용할 때 '원본'에서 가져온 문자열에 넓은 문자가 포함되어 있다는 것입니다. 소스 페이지는 이미 utf-8로 인코딩되어 있습니다. 사용중인 옵션 및 패키지는 다음과 같습니다.Perl 와이드 문자 (Mechanize get/mkdir fails)

use strict ; 
use warnings ; 
use utf8; 
use Encode qw(decode encode); 
use File::Path qw(make_path remove_tree); 
binmode(STDOUT, ":utf8"); 
use Win32::Unicode::Dir; 

아무런 문제없이 문자열을 인쇄 할 수 있습니다. 하지만 디렉토리를 만들려고 할 때 mkdir은 넓은 문자 나 잘못된 인수로 인해 불평합니다. 이후 mkdirW를 사용하여 Win32 :: Unicode 패키지로 해결 방법을 시도했습니다. 디렉토리는 이제 성공적으로 생성되지만 호출 할 때 나는 디렉토리를 사용할 수 없습니다 해요 :

$mech->get($url, ':content_file' => $savePath) or die $!; 

get 명령이 성공적으로 완료되지만 $의 savepath의 디렉토리가 비어 있습니다. 이 방법은 정상적인 영숫자 문자가있을 때 작동합니다. 폴더 제목의

예는 다음과 같습니다 꿀 蜂蜜 그래서

my $savePath = "C:\\" . $title . "\\Picture_of_honey.jpg"; 
where $title = "蜂蜜 Honey"; 

난 그냥 디렉토리를 만들고 파일을 저장 얻을 수 없습니다. 그것은 인코딩 문제가되어야하지만, 나는 UTF 8로 인코딩하려했으나 utf8로 이미 인코딩 된 이후로 원래 텍스트를 왜곡합니다. 디코딩하면 넓은 문자 오류가 발생합니다.

답변

0

Win32 :: Unicode :: Dir을 사용하면 LWP :: UserAgent와 같은 다른 패키지에서 버그 내장 Perl 기본 제공 open 등을 덮어 쓰지 않습니다. :content_cb 콜백을 사용하면 파일에 직접 쓸 수 있습니다.

제어 할 수없는 외부 웹 사이트가 시스템의 파일 이름을 결정하게하는 것은 좋지 않습니다. 이는 성가신 일입니다 (많은 문자가 Windows 파일 시스템에서 불법입니다) 또는 최악의 보안 결함입니다. 그 함정에 빠지거나 문서 제목을 별도로 데이터베이스/파일에 저장하지 말고 내용 문서에 코드가 생성 한 안전한 파일 이름을 지정하십시오.

+0

웹 사이트 문자를 안전하게 Windows 안전 문자로 변환하는 방법은 무엇입니까? 그래서 당신은 내가 모든 외국 텍스트를 파싱하고 그걸로 디렉토리를 만드는 대신 파일에 저장해야한다고 말하고 있습니다. 이 성가신 문제를 해결하는 방법에 대해 자세히 설명해 주시겠습니까? 나는 지금 보안에 대해 정말로 염려하지 않는다. – Jay