Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2010, 19:51   #1
gamer123
Пользователь
 
Регистрация: 19.01.2008
Сообщений: 92
По умолчанию idHTTP и кодировка

добрый вечер. в переменную типа стринг качается через идхттп гет запросом страница. страница в ютф8, после всего этого пытаюсь распарсить через pos (нужно найти фразу <liкакойтотекстнарусском<strong>) . соответственно, руские буквы кракозябрами, и пос их не ищет. пытался декодировать utf8toansi и наоборот - ничего не помогает. кракозябры меняются только
gamer123 вне форума Ответить с цитированием
Старый 13.09.2010, 11:00   #2
X11
Пользователь
 
Регистрация: 20.01.2010
Сообщений: 54
Радость

Попробуй этой функцией декодировать:

Код:
function UTF8ToStrSmart(Value: String): String;


      function UTF8ToStr(Value: String): String;
      var
        buffer: Pointer;
        BufLen: LongWord;
      begin
        BufLen := Length(Value) + 4;
        GetMem(buffer, BufLen);
        FillChar(buffer^, BufLen, 0);
        MultiByteToWideChar(CP_UTF8, 0, @Value[1], BufLen - 4, buffer, BufLen);
        Result := WideCharToString(buffer);
        FreeMem(buffer, BufLen);
      end;


var
  Digit: String;
  i: integer;
  HByte: Byte;
  Len: Byte;
begin
  Result := '';
  Len := 0;
  if Value = '' then Exit;
  for i := 1 to Length(Value) do
  begin
    if Len > 0 then
    begin
      Digit := Digit + Value[i];
      Dec(Len);
      if Len = 0 then
        Result := Result + UTF8ToStr(Digit);
    end else
    begin
      HByte := Ord(Value[i]);
      if HByte in [$00..$7f] then       //Standart ASCII chars
        Result := Result + Value[i]
      else begin
        //Get length of UTF-8 char
        if HByte and $FC = $FC then
          Len := 6
        else if HByte and $F8 = $F8 then
          Len := 5
        else if HByte and $F0 = $F0 then
          Len := 4
        else if HByte and $E0 = $E0 then
          Len := 3
        else if HByte and $C0 = $C0 then
          Len := 2
        else begin
          Result := Result + Value[i];
          Continue;
        end;
        Dec(Len);
        Digit := Value[i];
      end;
    end;
  end;
end;
X11 вне форума Ответить с цитированием
Старый 13.09.2010, 12:12   #3
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

UTF8Decode, UTF8Encode
ZuBy вне форума Ответить с цитированием
Старый 13.09.2010, 12:38   #4
gamer123
Пользователь
 
Регистрация: 19.01.2008
Сообщений: 92
По умолчанию

Цитата:
Сообщение от ZuBy Посмотреть сообщение
UTF8Decode, UTF8Encode
это не помогает, пробовал. есть предположение, что инди качает страницу в кодировке iso8859-1, несмотря на то, что скачиваемая страница в ютф8
gamer123 вне форума Ответить с цитированием
Старый 13.09.2010, 13:11   #5
X11
Пользователь
 
Регистрация: 20.01.2010
Сообщений: 54
По умолчанию

gamer123, ты мою функцию пробовал?
X11 вне форума Ответить с цитированием
Старый 13.09.2010, 13:12   #6
X11
Пользователь
 
Регистрация: 20.01.2010
Сообщений: 54
По умолчанию

Есть ещё 2 совета.
1. Брось инди и переходи на ICS.
2. Обнови инди до максимально последней версии.
X11 вне форума Ответить с цитированием
Старый 13.09.2010, 14:25   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Делфи с Юникодом?
скачивайте через TStringStream
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.09.2010, 14:44   #8
X11
Пользователь
 
Регистрация: 20.01.2010
Сообщений: 54
Подмигивание

Код:
function HttpGetUrl(url: string; idHttp: TidHttp): string;
var
  M: TStringStream;
begin
  M := TStringStream.Create('');
//  try

    try
      IdHTTP.Get(url, m);
      if IdHTTP.ResponseCode = 502 then
        begin
          result := 'ошибка|'+url;
          freeandnil(m);
          exit;
        end;

    except
      on e: exception do
        begin
//          MessageBox(application.ActiveFormHandle, PAnsiChar('Произошла ошибка при получении текста страницы: '+#13+ url + #13+e.Message), 'Ошибка', IDOK);
          result := 'ошибка|'+url;
          freeandnil(m);
        end;
    end;

    result := m.DataString;
//  finally
    freeandnil(m);
//  end;
end;
X11 вне форума Ответить с цитированием
Старый 13.09.2010, 14:58   #9
X11
Пользователь
 
Регистрация: 20.01.2010
Сообщений: 54
По умолчанию

итого полный код будет:
Код:
//получаем тест страницы со ссылками на объявления
slText :=  UTF8ToStrSmart(HttpGetUrl(URL, idHttp1));
X11 вне форума Ответить с цитированием
Старый 23.09.2010, 23:04   #10
HS_
Новичок
Джуниор
 
Регистрация: 23.09.2010
Сообщений: 3
Вопрос Зачем было мудрить

Почему бы было просто не использовать UTF8ToANSI ???
HS_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
idHTTP и кодировка FAiver Работа с сетью в Delphi 2 09.09.2012 16:47
Кодировка idHTTP.Get() X11 Работа с сетью в Delphi 15 22.01.2010 00:52
Кодировка Anny Общие вопросы по Java, Java SE, Kotlin 1 16.01.2009 13:02
Кодировка в C++ kpishnik Помощь студентам 2 24.07.2008 19:31
Кодировка psp Общие вопросы Delphi 7 01.04.2008 19:18