Скручиваемость кодировки SERP - PullRequest
0 голосов
/ 29 мая 2018
    $url = "https://www.google.pl/search?q=agawa+korzenie&oq=agawa+korzenie";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)"); //   "Content-type: text/html; charset=UTF-8"
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    //curl_setopt( $ch, CURLOPT_ENCODING, "" );

    curl_setopt($ch, CURLOPT_HTTPHEADER , array(
     //'Content-Type: application/x-www-form-urlencoded; charset=utf-8',
     'Content-Type: text/html; charset=utf-8',
    ));
   $icerik = curl_exec($ch);
   curl_close($ch);
   echo $icerik;

Кодировка ответа недействительна.Символы, такие как ś переводятся на?знак.Как я могу преодолеть эту проблему?

1 Ответ

0 голосов
/ 30 мая 2018

если то, что вы говорите, действительно верно, то это проблема с сервером, а не с curl.но, скорее всего, это не проблема с сервером, это, вероятно, проблема с тем, как вы видите результат.Вот мои теории, от наиболее вероятных до наименее вероятных:

1: вы просматриваете результат в веб-браузере, вы не предоставляете параметр encoding в заголовке Content-Type: и браузеридентифицируйте содержимое как HTML4, где кодировка по умолчанию - ISO-8859-1, и, таким образом, отображает его как ISO-8859-1, который не поддерживает ś, а браузер превращает недопустимые символы в ?.исправление состоит в том, чтобы изменить заголовок Content-Type на Content-Type: text/html;charset=utf8

2: то же самое, что и выше, но ваш сервер фактически предоставляет неправильный заголовок типа содержимого, например Content-Type: text/html;charset=ISO-8859-1, исправление такое же, каквыше.

3: сервер хранит данные в базе данных sql (например, mysql) с набором символов сохранения, установленным на ISO-8859-1 (или что-то близкое к нему), и затем база данных заменяет недопустимые символы на * 1016.* (Я видел это много раз в прошлом, но не в последние годы), и в этом случае код сервера должен быть исправлен.проверьте этот ответ https://stackoverflow.com/a/279279/1067003

4: вы запускаете PHP в терминале, который не поддерживает символы Юникода.решение состоит в том, чтобы переключиться на лучший терминал.(маловероятно, но эй, xterm все еще существует, и все еще имеет версию без юникода, возможно, вы используете обычный xterm)

5: на сервере действительно работает какая-то версия $response=str_replace($response,'ś','?');echo $response; ..крайне маловероятно, но не невозможно, что также должно быть исправлено на стороне сервера.проверьте этот ответ https://stackoverflow.com/a/279279/1067003

и, наконец, protip, вы в замешательстве, CURLOPT_HTTPHEADER - заголовок curl, отправляемый на целевой URL-адрес в запросе, когда вы устанавливаете Content-Type с помощью CURLOPT_HTTPHEADER, вы устанавливаете Content-Type длятело запроса curl.но поскольку вы не используете CURLOPT_INFILE и не используете CURLOPT_POSTFIELDS, тело запроса вообще не существует, и, следовательно, в запросе не должно быть заголовка типа содержимого, избавьтесь от него.Возможно, вы искали функцию header(), например, header('Content-Type: text/html; charset=utf-8');, которая отправит этот заголовок в браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...