HttpGetText (), автоопределение кодировки и преобразование источника в UTF8 - PullRequest
0 голосов
/ 31 марта 2011

Я использую HttpGetText с Synapse для Delphi 7 Professional, чтобы получить источник веб-страницы, но не стесняйтесь рекомендовать любой компонент и код.

Цель состоит в том, чтобы сэкономить некоторое время, объединив символы не ASCII в одну кодировку, чтобы я мог обработать его с помощью того же кода Delphi.

Поэтому я ищу что-то похожее на «Выбрать все и конвертировать в UTF без спецификации в Notepad ++», если вы понимаете, о чем я. ANSI вместо UTF8 тоже будет в порядке.

Веб-страницы кодируются в 3 наборах символов: UTF8, "ISO-8859-1 = Win 1252 = ANSI" и прямо по переулку HTML4 без спецификации набора символов, т.е. htmlencoded Å печатать символы в содержании.

Если мне нужно кодировать страницу PHP, которая выполняет преобразование, это тоже хорошо. Какой бы ни был наименьший код / ​​время.

Ответы [ 2 ]

0 голосов
/ 13 июня 2011

Вместо этого я сделал обратное преобразование непосредственно после извлечения HTML-кода с помощью GpTextStream.Приведение документов в соответствие с 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 голосов
/ 01 апреля 2011

Когда вы получаете веб-страницу, ее заголовок Content-Type (или иногда тег <meta> внутри самого HTML) сообщает вам, какая кодировка используется для данных.Вы должны декодировать данные в Unicode, используя эту кодировку, а затем можете кодировать Unicode в любое, что вам нужно для обработки.

...