Эта тема на forum.dklab.ru


Андрей Цьок: Проблема с кодировкой
Здраствуйте
Сделал я скрипт поиска черех яндекс XML
ввожу в форму поиска слово - іван
и в ответ от яндекса получаю - Ѭван
все букри отлично принимаються кроме - і

Вот код :
<?php

function request($name, $default_value = FALSE) {
return (isset($_REQUEST[$name]) && !empty($_REQUEST[$name]))?$_REQUEST[$name]:$default_value;
}
$query = request("query");
$page = request("page", 0);
$OUTPUT = "";

if (FALSE !== $query)
{
require_once 'j/Request.php';
$req = new HTTP_Request("http://xmlsearch.yandex.ru/xmlsearch");
$req->setMethod(HTTP_REQUEST_METHOD_GET);
$full_query = $query;

$req->addQueryString('query', htmlspecialchars($full_query));
$req->addQueryString('page', $page);
$req->addQueryString("maxpassages", 4);
$req->addQueryString("max-title-length",120);

$req->sendRequest();
$xml_data = $req->getResponseBody();
$xsl_data = file_get_contents("search.xsl");
$arguments = array('/_xml' => $xml_data,'/_xsl' => $xsl_data );
$xh = xslt_create();
$result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
if ($result) {
$OUTPUT = $result;
} else {
$OUTPUT.= "Sorry, ".$el." could not be transformed by $xsl_file,";
$OUTPUT.="the reason is that " . xslt_error($xh) . " and the error code is " . xslt_errno($xh);
}
xslt_free($xh);
}
echo($OUTPUT); // Выводим результаты поиска.
?> [/PHP:1:d2ce739532]

Как сделать чтоб Укр букву і нормально принимало ?
Спасибо.
dimagolov:
ну а в какой кодировке страница не раскажете?
Андрей Цьок: charset=windows-1251
charset=windows-1251
dimagolov:
а что говорит var_dump ($query) ?
это я к тому, где начинаются проблемы, в отправке запрося яндексу или в получении его с клиента?

кстати, пользователю совершенно не нужно показывать, что за ошибка произошла с xsl. это надо писать в лог, а пользователю некое стандартное сообщение об ошибке или отсутствии данных.
Андрей Цьок: Вот
Я вставил
var_dump ($query)
перед запросом к Яндексу и после вот что вышло
http://img529.imageshack.us/img529/5596/fistqm9.jpg
dimagolov:
читайте ман. потому что yandex как показал тест работает в UTF-8. Это наводит на мысль, что отдавать ему запросы и получать ответы тоже стоит в UTF-8.
возможно он умный, и русские буквы автоматом конвертит в UTF-8 если запрос в других кодировках приходит. а вот украинские похоже он игнорирует...
Андрей Цьок:
Вот нашел :

Скорее всего, вы делаете запрос и получаете ответ на уровне сокетов. Это довольно низкий уровень, и ответ может прийти как chunked HTML, как gzip и т. д. Проверить это можно, посмотрев на заголовок ответа сервера, там должна встретиться строка: «Transfer-Encoding: chunked» (подробнее см. RFC 2616).
Чтобы избавиться от ошибки, достаточно сделать одно из следующих действий:
писать в запросе POST ... HTTP/1.0, а не HTTP/1.1;
использовать более высокоуровневые средства для взаимодействия;
обрабатывать chunked-ответ.

Походу надо по другому делать всё =(
dimagolov:
Андрей Цьок, а что говорит ман яндекса по прикручиавния этого xmlsearch.yandex.ru на тему кодировок?
кстати, а что это за класс HTTP_Request? в пхп 5 есть вроде нативный http://www.php.net/manual/en/book.http.php
что же касается цитаты, то ну нифига не понял, как транспортный уровень может влиять на кодирование данных на уровне приложений... и про какую ошибку идет речь...
Андрей Цьок: =)
Я эще раз обьясню что я делаю и как.
Я делаю этот скрипт под ПхП4.
HTTP_Request - из PEAR . http://pear.php.net/
Вот что грит Яндекс - http://help.yandex.ru/xml/faq.xml?id=459280 вот у меня таже проблема с этой буквой і

И на счет самого скрипта :
Мне нужно сделать запрос query, GET или POST на http://xmlsearch.yandex.ru/xmlsearch/
require_once 'j/Request.php';
$req = new HTTP_Request("http://xmlsearch.yandex.ru/xmlsearch");
$req->setMethod(HTTP_REQUEST_METHOD_GET);
$full_query = $query;

$req->addQueryString('query', htmlspecialchars($full_query));
$req->addQueryString('page', $page);
$req->addQueryString("maxpassages", 4);
$req->addQueryString("max-title-length",120);

$req->sendRequest();

и принять XML ответ от сервера.

Дальше я этот XML с помощу XSL шаблона перевожу в HTML.

$req->sendRequest();
$xml_data = $req->getResponseBody();
$xsl_data = file_get_contents("search.xsl");
$arguments = array('/_xml' => $xml_data,'/_xsl' => $xsl_data );
$xh = xslt_create();
$result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);

Сделал все но этот глюк меня чуть не убил =) работает скрипт со всеми буквами Укр Рус кроме і , І
Запрос идет в windows-1251, ответ приходит в UTF-8
полный скрипт в 1 посте


Мб вы знаете как сделать по другому запрос к ЯндексХМЛ серверу ? или что это может быть за глюк ,может я ошибся в коде гдето.?
Андрей Цьок: м
Эсли ктонить поможет доделать скрипт,
то будет +1 хороший скрипт в колекцию ДКлаб.
Андрей Цьок: 1
Вот переделал всё под cURL :) начало принимать все буквы.
http://center.if.ua/fist.jpg
НО !
Теперь ешё 1 проблема =(

<?php
$query = $_GET['query'];
$page = $_GET['page'];
$OUTPUT = "";
if (FALSE !== $query)
{
$post='<?xml version=\'1.0\' encoding=\'windows-1251\'?>
<request>
<query>'.$query.')</query>
<page>0</page>
<maxpassages>4</maxpassages>
</request>';
$curl=@curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://xmlsearch.yandex.ru/xmlsearch/');
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
$xml_data = curl_exec($curl);
$xsl_data = file_get_contents("search.xsl");
$arguments = array('/_xml' => $xml_data,'/_xsl' => $xsl_data );
$xh = xslt_create();
$result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
if ($result) {
$OUTPUT = $result;
} else {
$OUTPUT.= "Sorry, ".$el[file]." could not be transformed by $xsl_file,";
$OUTPUT.="the reason is that " . xslt_error($xh) . " and the error code is " . xslt_errno($xh);
}
xslt_free($xh);
}
echo($OUTPUT);
?>

Проблема в том , что после того как все сложиться в HTML страницу
Я например хочу перейти на 2-ю страницу поиска
http://center.if.ua/fist3.jpg
после перехода весь запрос становиться таким :
http://center.if.ua/fist2.jpg

Мне кажеться что эти ссылки формируються в неправильной кодировке
Например для поиска фісташкі 2 - ссылка на 2-ю страницу :
http://ukrday.net/2.php?query=%d1%84%d1%96%d1%81%d1%82%d0%b0%d1%88%d0%ba%d1%96%202%20%20&groupby=mode%3D.attr%3D.groups-on-page%3D.docs-in-group%3D.curcateg%3D&page=1

query = %d1%84%d1%96%d1%81%d1%82%d0%b0%d1%88%d0%ba%d1%96%202%20%20 <- запрос : фісташкі 2

и когда мой скрипт принимает этот текст и отсылает яндексу мне приходят эти иероглифы =(

Мб ктонить подскажет как изменить или переделать этот кусок скрипта чтоб переходы на другие страницы были в норм кодировке ?
ЗЫ: Запрос к яндекс серверу идет в windows-1251 ответ приходит в utf-8 , xsl шаблон в windows-1251 кодировке.
Вот я незнаю как и что тут исправлять =( ссылка на сам ХСЛ шаблон - http://xml.yandex.ru/examples/example_2.txt
Буду очень благодарен тому кто поможет решить эту проблему а то уже 4 день сижу над этим поиском =(
Андрей Цьок: Андрей Цьок
Да точно ! ссылки на другие страницы стают в utf-8,
эсли вставить :
в начало скрипта
$quer = $_GET['query'];
$query = iconv('UTF-8','Windows-1251',$quer);

и ввысти запрос в utf-8 все работает.

Вот теперь у меня вопрос, можна ли в самом XSL шаблоне применять Iconv ?
или как мне в XSL переменную $query переделать в windows-1251. ?
Спасибо.
dimagolov:
Как можно быть таким не внимательным???
http://help.yandex.ru/xml/faq.xml?id=454717

а пхп 4 умер, про него стоит забыть
Андрей Цьок: dimagolov
Спасибо dimagolov , хоть я и не сделал скрипт но вы мне очень помогли .
Теперь надо мне ПхП5 подучить =)

Эта тема на forum.dklab.ru