2011-03-31 7 views
0

웹 페이지의 소스를 얻으려면 Synapse와 함께 HttpGetText를 사용하고 있지만 구성 요소와 코드는 자유롭게 추천합니다.HttpGetText(), charset 자동 검색 및 UTF8 소스 변환

목표는 비 ASCII 문자를 단일 문자 세트로 '통합'하여 시간을 절약하는 것이므로 동일한 델파이 코드로 처리 할 수 ​​있습니다.

그래서 내가 무슨 뜻인지 아는 경우 "메모를 모두 선택하고 BOM이없는 UTF로 바꾸기"와 비슷한 것을 찾고 있습니다. UTF8 대신 ANSI도 괜찮습니다.

웹 페이지는 UTF8, "ISO-8859-1 = Win 1252 = ANSI"의 세 가지 문자 집합으로 인코딩되며 charset 사양없이 HTML4를 곧바로 만듭니다. htmlencoded Å 유형 문자가 내용에 포함됩니다.

변환을 수행하는 PHP 페이지를 코딩해야하는 경우에도 좋습니다. 최소한의 코드/시간은 무엇이든간에.

답변

0

대신 GpTextStream을 사용하여 HTML을 검색 한 후 역 변환을 직접 수행했습니다. 문서를 ISO-8859-1에 맞게 만들면 직선적 인 Delphi를 사용하여 처리 할 수있게되어 코드 변경 사항이 상당히 줄어 들었습니다. 출력시 모든 데이터가 UTF-8로 변환되었습니다.

일부 코드가 있습니다. 아마도 가장 좋은 해결책은 아니지만 시간을 절약하면서 작업을 완료 할 수 있습니다. 이는 의 역방향 변환에 해당합니다.

procedure UTF8FileTo88591(fileName: string); 
const bufsize=1024*1024; 
var 
fs1,fs2: TFileStream; 
ts1,ts2: TGpTextStream; 
buf:PChar; 
siz:integer; 
    procedure LG2(ss:string); 
    begin 
     //dont log for now. 
    end; 

begin 
    fs1 := TFileStream.Create(fileName,fmOpenRead); 
    fs2 := TFileStream.Create(fileName+'_ISO88591.txt',fmCreate); 
    //compatible enough for my purposes with default 'Windows/Notepad' CP 1252 ANSI and Swe ANSI codepage, Latin1 etc. 
    //also works for ASCII sources with htmlencoded accent chars, naturally 
    try 
     LG2('Files opened OK.'); 
     GetMem(buf,bufsize); 
     ts1 := TGpTextStream.Create(fs1,tsaccRead,[],CP_UTF8); 
     ts2 := TGpTextStream.Create(fs2,tsaccWrite,[],ISO_8859_1); 
     try 
     siz:=ts1.Read(buf^,bufsize); 
     LG2(inttostr(siz)+' bytes read.'); 
     if siz>0 then ts2.Write(buf^,siz); 
     finally 
     LG2('Bytes read and written OK.'); 
     FreeAndNil(ts1);FreeAndNil(ts2);end; 
    finally FreeAndNil(fs1);FreeAndNil(fs2);FreeMem(buf); 
     LG2('Everything freed OK.'); 
    end; 
end; // UTF8FileTo88591 
0

웹 페이지를 검색 할 때 Content-Type 헤더 (또는 때때로 HTML 내부에 <meta> 태그가 있음)는 데이터에 사용되는 문자 집합을 알려줍니다. 해당 charset을 사용하여 데이터를 유니 코드로 디코딩 한 다음 유니 코드를 처리에 필요한 모든 항목으로 인코딩 할 수 있습니다.

+0

감사합니다. 문제는 Synapse가이 작업을 수행할지 또는 다른 코드를 작성해야하는지 여부입니다. 그것은 보통 어떻게 이루어 집니까? –

+0

@Henrik : 마지막으로 확인했는데, Synapse가 자동으로 데이터를 디코딩하지 않습니다. HTTP 헤더 및/또는 HTML 내용을 직접 확인한 다음 데이터를 수동으로 해독해야합니다. FWIW, 현재 버전의 Indy 10은 파싱 및 디코딩을 수행합니다. –