2014-02-12 3 views
2

У меня проблема с заданием URL-адресов с помощью Umlauts (например, «ü»).Curl Issue: Umlauts в URL

Например "http://www.ebay.de/bhp/kühlschrank":

Мой Сценарий:

function getUrlContent($url) 
{ 
    //echo $url; 
    $ch = curl_init(); 


    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 10 seconds 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_ENCODING ,"UTF-8"); 


    $response=curl_exec($ch); 
    $i = curl_getinfo($ch); 
    echo "<pre>"; 
    print_r($i); 
    return $response; 

} 

$url="http://www.ebay.de/bhp/kühlschrank"; 
$response = getUrlContent($url); 

Это всегда приводит к 404.

Любые идеи?

+0

Try для кодирования URL, прежде чем проход в getUrlContent() http://stackoverflow.com/questions/996139/php -urlencode-vs-rawurlencode – wasishincar

ответ

2

Необходимо указать utf8_decode() параметр $ url и добавить параметр cURL. FOLLOWLOCATION

<?php 
function getUrlContent($url) 
{ 
    //echo $url; 
    $ch = curl_init(); 


    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 10 seconds 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); //<------- I added it here ! 
    curl_setopt($ch, CURLOPT_ENCODING ,"UTF-8"); 


    $response=curl_exec($ch); 
    $i = curl_getinfo($ch); 
    echo "<pre>"; 
    print_r($i); 
    return $response; 

} 

$url="http://www.ebay.de/bhp/kühlschrank"; 
$response = getUrlContent(utf8_decode($url)); //<---- utf8 decode !! 

OUTPUT :

Array 
(
    [url] => http://pages.ebay.com/messages/DE_page_not_responding.html?RlogId=t6awipp%60c%7Fs%3F%3Ctof2e34e*%3B4c3-144258a5d5d-0x1f0 
    [content_type] => text/html;charset=UTF-8 
    [http_code] => 200 
    [header_size] => 1233 
    [request_size] => 264 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 1 
    [total_time] => 1.235 
    [namelookup_time] => 0.266 
    [connect_time] => 0.485 
    [pretransfer_time] => 0.485 
    [size_upload] => 0 
    [size_download] => 4611 
    [speed_download] => 3733 
    [speed_upload] => 0 
    [download_content_length] => 4611 
    [upload_content_length] => 0 
    [starttransfer_time] => 0.735 
    [redirect_time] => 0.469 
    [certinfo] => Array 
     (
     ) 

    [primary_ip] => 66.135.205.14 
    [primary_port] => 80 
    [local_ip] => 192.168.1.9 
    [local_port] => 61581 
    [redirect_url] => 
) 
+0

Конечно, я только что протестировал, и страница ожидает ISO-8859-1 в URL-адресе. По какой-то причине я предположил, что все современные браузеры по умолчанию не соответствуют UTF-8 ... –

+0

@ ÁlvaroG.Vicario, я думаю, что Google Chrome 'Version 32.0.1700.107 m' не является. –

+0

С этой версией ответ-HTML-код отличается от HTML-кода в браузере. (Http://pages.ebay.com/messages/DE_page_not_responding.html?RlogId=t6awipp%60c%7Fs%3F%3Ctof2e34e*%3B4c3-144258a5d5d-0x1f0) – user3074602

0

альтернативное решение бедного-человека, чтобы кормить Curl с простой US-ASCII Verion по адресу:

http://www.ebay.de/bhp/k%C3%BChlschrank 

Я получил мое от извлечение страницы с помощью Firefox и копирование URL-адреса из строки местоположения, но вы также можете сделать это с PHP:

// Assuming UTF-8 
$url="http://www.ebay.de/bhp/" . rawurlencode("kühlschrank"); 
0

Curl не кодирует URL-адрес для вас, вы должны это сделать. То есть, он должен быть закодирован в URL. Строго вы не должны просто расшифровывать UTF8, поскольку это не то же самое. Вы должны использовать rawurlencode():

<?php 
function getUrlContent($url) 
{ 
     //echo $url; 
     $ch = curl_init(); 


     curl_setopt($ch, CURLOPT_URL,$url); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
     curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 10 seconds 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
     curl_setopt($ch, CURLOPT_HEADER, 1); 
     curl_setopt($ch, CURLOPT_ENCODING ,"UTF-8"); 


     $response=curl_exec($ch); 
     $i = curl_getinfo($ch); 
     echo "<pre>"; 
     print_r($i); 
     return $response; 

} 

$url="http://www.ebay.de/bhp/" . rawurlencode("kühlschrank"); 
$response = getUrlContent($url); 
?> 

ВЫВОД:

Array 
(
    [url] => http://www.ebay.de/bhp/k%C3%BChlschrank 
    [content_type] => text/html;charset=utf-8 
    [http_code] => 200 
    [header_size] => 1007 
    [request_size] => 94 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 0 
    [total_time] => 1.669702 
    [namelookup_time] => 0.606492 
    [connect_time] => 0.744441 
    [pretransfer_time] => 0.744556 
    [size_upload] => 0 
    [size_download] => 44032 
    [speed_download] => 26371 
    [speed_upload] => 0 
    [download_content_length] => -1 
    [upload_content_length] => 0 
    [starttransfer_time] => 1.386599 
    [redirect_time] => 0 
    [certinfo] => Array 
     (
     ) 

    [primary_ip] => 23.2.16.17 
    [primary_port] => 80 
    [local_ip] => 10.1.1.2 
    [local_port] => 56592 
    [redirect_url] => 
)