Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Cсылки в utf-8 (win-1252) -> ANSI, Как преобразовать? 
:(
    Опции темы
sg729
Дата 31.5.2009, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.5.2009

Репутация: 1
Всего: 1



Некоторые ссылки html-страницы (в кодировке utf-8) интерфейс IHtmlElement почему-то отображает в кодировке win-1252.
Как преобразовать, например такую строку:
Код

text=апельсин&isize=wallpaper&rpt=image

в строку ANSI к виду:
Код

text=%D0%B0%D0%BF%D0%B5%D0%BB%D1%8C%D1%81%D0%B8%D0%BD&isize=wallpaper&rpt=image

???

Пробовал для начала преобразовать в ANSI с помощью UTF8ToAnsi, Utf8Decode, UTF8ToStrSmart - ничего не получилось.
UTF8ToAnsi и Utf8Decode возвращают пустоту, а UTF8ToStrSmart (http://forum.vingrad.ru/forum/topic-133239/anchor-entry1007351/0.html) - знаки вопроса:
Код

text=?°???µ?»N?N?????&isize=wallpaper&rpt=image

PM MAIL   Вверх
Keeper89
Дата 1.6.2009, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 6
Всего: 58



Честно говоря, попробовал и легко перевел с помощью UTF8ToAnsi данную страницу Винграда из UTF-8 в ANSI (сохраняя страницу в файл). Может дело в IHtmlElement?


--------------------
PM MAIL WWW   Вверх
sg729
Дата 1.6.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.5.2009

Репутация: 1
Всего: 1



Цитата(Keeper89 @  1.6.2009,  00:13 Найти цитируемый пост)
Честно говоря, попробовал и легко перевел с помощью UTF8ToAnsi данную страницу Винграда из UTF-8 в ANSI (сохраняя страницу в файл)

Я пробую вот эту страницу:
http://images.yandex.ru/yandsearch?text=%D...amp;stype=image
Яндекс возвращает utf-8. И в документе, если его сохранить в файл и посмотреть в редакторе, все правильно - например вот так:
Код

<li>            <a onclick="w(this,'8.145.158');" href="/yandsearch?text=%D0%B0%D0%BF%D0%B5%D0%BB%D1%8C%D1%81%D0%B8%D0%BD&amp;isize=wallpaper&amp;rpt=image">Обои</a>        </li>

Но IHtmlElement почему-то выдает эту ссылку как:
about:blank/yandsearch?text=апельсин&isize=wallpaper&rpt=image

Цитата(Keeper89 @  1.6.2009,  00:13 Найти цитируемый пост)
Может дело в IHtmlElement? 

Очень может быть.
Однако некоторые ссылки IHtmlElement все-таки выдает правильно, например:
Код

<li><a target="_blank" href="http://images.google.ru/images?q=%D0%B0%D0%BF%D0%B5%D0%BB%D1%8C%D1%81%D0%B8%D0%BD" onclick="w(this,'8.65.66');">Google</a></li>

IHtmlElement выдает как:
http://images.google.ru/images?q=%D0%B0%D0...%81%D0%B8%D0%BD

Это сообщение отредактировал(а) sg729 - 1.6.2009, 19:15
PM MAIL   Вверх
Romikgy
Дата 1.6.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



юзая такой модуль dzurl и такой код
Код

function TvpDB.DecodeString(instr: string): string;
var ss: string;
begin
  ss:= instr;
  Result:=Utf8ToAnsi(dzurl.UrlDecode(ss));
  Result:=StringReplace(Result,'&lt;','<',[rfReplaceAll]);
  Result:=StringReplace(Result,'&gt;','>',[rfReplaceAll]);
end;

я получал то что нужно удачи

Это сообщение отредактировал(а) Romikgy - 1.6.2009, 20:22

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  dzurl.rar 0,89 Kb


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
sg729
Дата 2.6.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.5.2009

Репутация: 1
Всего: 1



Цитата(Romikgy @  1.6.2009,  20:20 Найти цитируемый пост)
я получал то что нужно удачи

Спасибо!  smile 
Увы, но здесь эта фишка не спасает  smile 
Для тега:
Код

<li>            <a onclick="w(this,'8.145.158');" href="/yandsearch?text=%D0%B0%D0%BF%D0%B5%D0%BB%D1%8C%D1%81%D0%B8%D0%BD&amp;isize=wallpaper&amp;rpt=image">Обои</a>        </li>

функция:
Код

Utf8ToAnsi(dzurl.UrlDecode(HtmlElement.getAttribute('href',0)))

возвращает пустоту.
А если посмотреть, что возвращает функция:
Код

dzurl.UrlDecode(HtmlElement.getAttribute('href',0))
 
то получается такая штука:
Код

about:blank/yandsearch?text=?°???µ?»N?N?????&isize=wallpaper&rpt=image

Да и по смыслу здесь нужно обратное преобразование, т.е. не UrlDecode, а наоборот UrlEncode - из юникода в "строку с процентами". 
Но dzurl.UrlDecode конвертит в "проценты" всю строку без разбора.
По идее здесь нужно:
1) определить, что в строке есть подстрока utf-8, отображаемая как win-1252
2) отыскать способ как эту подстроку (и всю строку в целом) превратить в ansi

PM MAIL   Вверх
Romikgy
Дата 2.6.2009, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Цитата(sg729 @  2.6.2009,  17:37 Найти цитируемый пост)
HtmlElement.getAttribute('href',0)

покажи что возвращает эта функция

Добавлено @ 19:26
Цитата(sg729 @  2.6.2009,  17:37 Найти цитируемый пост)
/yandsearch?text=%D0%B0%D0%BF%D0%B5%D0%BB%D1%8C%D1%81%D0%B8%D0%BD&amp;isize=wallpaper&amp;rpt=image

по этой строке у мя все работает
вот пример что у меня заработал 
вот ответ
Код

/yandsearch?text=апельсин&amp;isize=wallpaper&amp;rpt=image

дельфи 7 у мя


Это сообщение отредактировал(а) Romikgy - 2.6.2009, 19:28

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  decode_url.rar 167,37 Kb


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Romikgy
Дата 2.6.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



а если сделать так 
Код

function DecodeString(instr: string): string;
begin
  Result:=Utf8ToAnsi(dzurl.UrlDecode(instr));
  Result:=StringReplace(Result,'&lt;','<',[rfReplaceAll]);
  Result:=StringReplace(Result,'&gt;','>',[rfReplaceAll]);
  Result:=StringReplace(Result,'&amp;','&',[rfReplaceAll]);
end;

тогда ответ вообще хорош
Код

/yandsearch?text=апельсин&isize=wallpaper&rpt=image



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
sg729
Дата 2.6.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.5.2009

Репутация: 1
Всего: 1



Цитата(Romikgy @  2.6.2009,  19:12 Найти цитируемый пост)
Цитата(sg729 @  2.6.2009,  17:37 Найти цитируемый пост)
HtmlElement.getAttribute('href',0)

покажи что возвращает эта функция


вот что :
Код

about:blank/yandsearch?text=апельсин&isize=wallpaper&rpt=image

PM MAIL   Вверх
sg729
Дата 2.6.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.5.2009

Репутация: 1
Всего: 1



Цитата(Romikgy @  2.6.2009,  19:12 Найти цитируемый пост)
по этой строке у мя все работает
вот пример что у меня заработал 


ну, это понятно - ты же даешь на вход строку с "процентами", так и должно получиться.

У меня другая проблема - интерфейс IHtmlElement выдает из DOM строку не совсем в UTF-8, а слегка измененную - как будто ее "прожевали" через кодировку win-1252 (точнее через ISO-8859-1, если верить http://2cyr.com/decode/?lang=ru ).

А код такой (Delphi 7) :

Код

procedure TForm1.Button3Click(Sender: TObject);
var
  SearchKey : UTF8String;
  v : OleVariant;
  i : Integer;
  HtmlURL : String;
  WB : IWebBrowser2;
  HtmlDocument : IHtmlDocument2;
  HtmlCollection, LinksCollection : IHtmlElementCollection;
  HtmlElement : IHtmlElement;
  HtmlContent : TTntStringList;
  HtmlText:String;
  HTTP: TidHTTP;
begin
  TntMemo1.Clear;
  TntMemo2.Clear;

  SearchKey:=UTF8Encode(KeyLabeledEdit.Text);
  HtmlURL:='http://images.yandex.ru/yandsearch?text='+UrlEncode(SearchKey)+'&stype=image';
  URLLabeledEdit.Text:=HtmlURL;

  HtmlContent:=TTntStringList.Create;

  WB:=CoInternetExplorer.Create;
  WB.Visible:=False;
  WB.Silent:=True;

  HTTP:=TidHTTP.Create(nil);
  try
    HtmlText:=HTTP.Get(HtmlURL);
    TntMemo1.Text:=HtmlText;
  except
    on e:Exception do
    begin
      HTTP.Disconnect;
    end;
  end;
  HTTP.Free;

  WB.Navigate('about:blank', EmptyParam, EmptyParam, EmptyParam, EmptyParam);
  HtmlDocument:=WB.Document as IHtmlDocument2;
  HtmlDocument.Clear;

  v:=VarArrayCreate([0,0],VarVariant);
//  v[0]:=UTF8Decode(HtmlContent.Text);
  v[0]:=HtmlText;
  HtmlDocument.Write(PSafeArray(TVarData(v).VArray));

  HtmlCollection:=HtmlDocument.All;
  LinksCollection:=HtmlCollection.Tags('A') as IHTMLElementCollection;
  for i:=0 to LinksCollection.Length-1 do
  begin
    HtmlElement:=LinksCollection.Item(i,0) as IHtmlElement;
    TntMemo2.Lines.Add(HtmlElement.getAttribute('href',0));
//    TntMemo2.Lines.Add(Utf8ToAnsi(HtmlElement.getAttribute('href',0)));
//    TntMemo2.Lines.Add(Utf8Decode(HtmlElement.getAttribute('href',0)));
//    TntMemo2.Lines.Add(UTF8ToStrSmart(HtmlElement.getAttribute('href',0)));
  end;
  HtmlDocument.Close;
  TntMemo2.Lines.SaveToFile('links.txt');

  HtmlContent.Free;
  HtmlDocument.Close;
  HtmlDocument:=nil;

  WB.Quit;
  WB:=nil;

  Application.MessageBox('Поиск выполнен!','Поиск',MB_OK+MB_ICONINFORMATION);
end;


В TntMemo2 смотри ссылку в которой есть фраза wallpaper - она самая первая с крякозябрами. 
Еще поставь в свойствах TntMemo2 шрифт Tahoma, иначе не увидишь - MS Sans Serif не переваривает юникодные кодировки.



Это сообщение отредактировал(а) sg729 - 2.6.2009, 22:38
PM MAIL   Вверх
Romikgy
Дата 2.6.2009, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



имхо товарисчь sg729, у вас смешались и кони и пони .... зачем использовать очень не безопастные переходы юникод в анси стринг и обратно ? только для парсинга?
я так понял задача по получению ссылок хорошо ложится под мой ответ по поднятой теме , но запутались с выше обозначеными переходами ,
уберите использование интерфейсов и найдите парсер хтмл кода , и уйдут 
Цитата(sg729 @  2.6.2009,  21:29 Найти цитируемый пост)
не совсем в UTF-8, а слегка измененную - как будто ее "прожевали" через кодировку win-1252 (точнее через ISO-8859-1, если верить http://2cyr.com/decode/?lang=ru ).

такие фразы..... 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
sg729
Дата 3.6.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.5.2009

Репутация: 1
Всего: 1



Цитата(Romikgy @  2.6.2009,  23:58 Найти цитируемый пост)
имхо товарисчь sg729, у вас смешались и кони и пони 

Так ведь и жизнь сложна и разнообразна   smile 

Цитата(Romikgy @  2.6.2009,  23:58 Найти цитируемый пост)
зачем использовать очень не безопастные переходы юникод в анси стринг и обратно ? только для парсинга?

Ссылка типа такой:
Код

 about:blank/yandsearch?text=апельсин&isize=wallpaper&rpt=image

к сожалению не открывается ни браузером, ни программным путем. Только из-за этого я пытаюсь привести ее к читабельному виду. Будет ли это ansi или юникод вобщем-то все равно, лишь бы она работала. Желательно, конечно, в ansi, потому что ссылки нужно сохранять в базе данных и заморачиваться с юникодом еще и в базе данных нет желания. Но я не фанатик конкретной кодировки, мне нужен конечный результат, а именно: собрал ссылки со страницы, выбрал нужные и открыл их - и так далее.

Цитата(Romikgy @  2.6.2009,  23:58 Найти цитируемый пост)
уберите использование интерфейсов и найдите парсер хтмл кода 

Буду благодарен за подсказку на тему где найти бесплатный парсер, не уступающий по качеству IE или FireFox   smile 


Это сообщение отредактировал(а) sg729 - 3.6.2009, 10:20
PM MAIL   Вверх
Romikgy
Дата 3.6.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146





--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
sg729
Дата 3.6.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.5.2009

Репутация: 1
Всего: 1



Благодарю!  smile 
Надеюсь, эти парсеры найдут ровно столько же ссылок, сколько выдает DOM  smile 


Это сообщение отредактировал(а) sg729 - 3.6.2009, 21:53
PM MAIL   Вверх
sg729
Дата 4.6.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.5.2009

Репутация: 1
Всего: 1



Попробовал 7 разных парсеров, ни один не устроил - в лучшем случае ищут "узлы", готовую коллекцию ссылок не дают.
Почитал обзор по парсерам: http://december.nm.ru/DelphiHTMLParsers.htm и мнение автора обзора здесь:
http://forum.vingrad.ru/forum/topic-40148/unread-1.html#
Цитата

Я искал хороший компонент-парсер, но бесплатных хороших нет

и понял, что искать решение в бесплатных парсерах нет смысла  smile 
PM MAIL   Вверх
Romikgy
Дата 4.6.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



тогда сочетай (правильно) уже имеющееся smile
кса объясни на пальцах что выдает 
Цитата(sg729 @  3.6.2009,  20:15 Найти цитируемый пост)
DOM

а то это интерфейсы как я понял от броузера и что за набор методов нужен для парсинга?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1078 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.