На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Serafim, fatalist
  
    > fopen , глюки.. или что?
      делаю поисковую форму: формирую строку адреса для поискового сервера и fopen(адрес).
      Затем полученные данные записываю на диск.
      НО!!!
      Полученный код не содержит символов кирилицы!

      Объясню на примере:

      Пусть например я сформировал такую строку адреса:
      Цитата
      http://search.yahoo.com/search?va=drive&vs=www.el-drive.com.ua&vl=lang_ru


      Если зайти на такую ссылку, то получу результирующую форму, сформированную сервером Яху.

      Обратите внимание результат поиска содержит кучу русскоязычного текста.
      Но когда я эту результат работы fopen сохраняю на себе диск - то символы кирилицы: ПЧ и все другие - теряются...

      Почему??? Может я неправильно заставил работать fopen???

      Вот часть кода:
      ExpandedWrap disabled
         
        $strSearch ='http://search.yahoo.com/search?va=drive&vs=www.el-drive.com.ua&vl=lang_ru';
        $screen = file($strSearch);
            
        $fp = fopen('mySearch.htm',"w");
        for ($j=1; $j<sizeof($screen); $j++)
        {
            fwrite ( $fp, $screen[$j] );
        }   //  for $i
        fclose( $fp );


      Хэлп, плиз.

      Можно было бы сказать, что я не ввожу некоторых языковых параметров для Yahoo, но ведь заход по обычному URL-у выполняет поиск и содержит все символы кирилицы...

      Пример работы скрипта можно увидеть по адресу:
      http://www.el-drive.com.ua/myG.php?q=drive

      Добавлено в :
      Кое чего разобрался...

      Кажись от Yahoo идёт ответ в юникоде...

      Т.е. русские символы моим скриптом некорректно обрабатываются... а как преобразовать юникодовские символы в win1251?
      Сообщение отредактировано: Budda -
        Или ещё попробуй
        ExpandedWrap disabled
          fopen($url, 'wb');


        ExpandedWrap disabled
          $sock=fsockopen(.....);
          ..............................................
          puts($sock, "Accept-Charset: windows-1251\n");
          ..............................................
        Сообщение отредактировано: Tishaishii -
          Tishaishii, ты не смотри, что у меня "Профи" и 5 квадратиков. Я в Visual С вроде разбираюсь неплохо, потому, плиз объясни, что это у тебя за шутка такая?
            Есть функция convert_cyr_string(). Попробуй так:
            ExpandedWrap disabled
              $strSearch ='http://search.yahoo.com/search?va=drive&vs=www.el-drive.com.ua&vl=lang_ru';
              $screen = file_get_contents($strSearch);
               
              $screen = convert_cyr_string($screen, 'UTF-8', 'WINDOWS-1251');
                
              $fp = fopen('mySearch.htm', 'w');
              fwrite($fp, $screen);
              fclose($fp);


            ЗЫ: "штука" читает файл через сокет, сообщив серверу, чтоб выдавал в WINDOWS-1251.
              Пытлася юзать convert_cyr_string(). Получил ворнинг:

              Warning: convert_cyr_string() [function.convert-cyr-string]: Unknown source charset: U in w:\home\el-drive.localhost\www\myg.php on line 16

              ща пробую первый вариант

              Цитата
              ЗЫ: "штука" читает файл через сокет, сообщив серверу, чтоб выдавал в WINDOWS-1251

              То я говорил о том приколе, который перед твоим редактированием был...
                Это очень хорошо.


                Аннотация функции fsockopen:
                ExpandedWrap disabled
                  int fsockopen ( string hostname, int port [, int errno [, string errstr [, float timeout]]])

                http://www.php.net

                Открывает сокет с заданными параметрами (hostname, port, ...), возвращает файловый идентификатор типа int.
                ExpandedWrap disabled
                  $host='search.rambler.ru';
                  $document='/srch?words=fsockopen&where=1';
                  $charset='windows-1251';
                   
                  if(!($sock=fsockopen($host, 80)))#Открываю соединение с search.rambler.ru:80
                  {
                      echo 'Ошибка';
                      exit();
                  }
                  fputs($sock, "GET $document HTTP/1.0\n");#Стандартный HTTP-запрос типа "GET"
                  fputs($sock, "Host: $host\n");#К какому хосту передать запрос
                  fputs($sock, "Accept-Charset: $charset\n");#Предпочтительная кодировка
                  fputs($sock, "\n");#Заканчиваю говорить я, слушаю что скажет он.
                  while(!feof($sock))echo fgets($sock, 0x400);#Получаю 1 кб. документа
                  fclose($sock);#Закрываю соединение


                А в первом случае я предлогал добавить в fopen к флагу 'w' флаг 'b'.
                w - запись
                b - бинарный файл
                Сообщение отредактировано: Tishaishii -
                  convert_cyr_string() не знает UTF-8, т.к. он знает только русские кодировки.

                  Плюсик Тишайшему поставь сам ;)
                    А что так?
                    Прошло времяВот это да....
                    Сообщение отредактировано: Tishaishii -
                      Благодаря Тишайшему и Романычу получилось: результат таков:
                      ExpandedWrap disabled
                         
                        $strSearch ='http://search.yahoo.com/search?va=drive&vs=www.el-drive.com.ua';
                         
                        $sock=fsockopen("66.218.71.233",80);
                        fputs($sock, "GET /search?_adv_prop=web&x=op&ei=UTF-8&prev_vm=p&va=drive&va_vt=any&vp=&vp_vt=any&vo=&vo_vt=any&ve=&ve_vt=any&vd=all&vst=on&vs=www.el-drive.com.ua&vf=all&vm=i&vc=&fl=0&n=20 HTTP/1.1\r\n");
                        fputs($sock, "Host: search.yahoo.com\r\n");
                        fputs($sock, "Accept-Charset: utf-8\r\n\r\n");
                        $screen = '';
                        while (!feof($sock)) {
                            $screen .= fgets($sock, 128);
                        }
                        fclose($sock);
                        $parts = split("\r\n\r\n", $screen, 2);
                        $screen = $parts[1];

                      В результета работы скрипта $screen содержит полученный от Яху ответ разбитый на строки.

                      Романыч, кинь сюда пост, я тебе за него плюсик сделаю.
                        А вот и я ;) Весь фокус был в Accept-Charstet. Пока не поставил его в utf-8, то всё работало криво, а с ним всё уладилось.
                          Прошло время. Вот это дааа...
                            :offtop: Tishaishii, это ты или твои боты удивляются??? :offtop:
                              M
                              Господа, давайте прекращать оффтопик  ;)
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0375 ]   [ 15 queries used ]   [ Generated: 27.04.24, 15:49 GMT ]