2011-06-27 58 views
2

我正在從地理定位網站的給定地址(經度/緯度)中檢索可用的最近位置。 它工作正常,但在某些地方,它給名稱中的垃圾字符。而且,在瀏覽器中,我得到與我的PHP CURL功能相比不同的字符。 這裏是URL在獲取位置列表時PHP中的CURL問題

http://www.geoplugin.net/extras/nearby.gp?lat=17.7374669&long=83.3214858&limit=5&radius=50&format=php

一個位置是「Sitammapeta」在原來的位置名稱,但在瀏覽器中我得到「Sītammapeta」,其中在捲曲功能我得到「SA«tammapeta」。

請告訴我爲什麼這種差異。我寫了一個函數來將瀏覽器輸出轉換爲原始的,這很好。

function convert ($old) 
    { 
     $n=""; 
     for ($i=0; $i<strlen($old); $i++) 
     { 
      $n .= chr(ord(substr($old,$i,1))); 
     } 
     return $n; 
    } 

但我不明白如何將CURL輸出轉換爲原始名稱。

編輯 捲曲代碼

$ch = curl_init(); 
      curl_setopt($ch, CURLOPT_URL, $host); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
      curl_setopt($ch, CURLOPT_USERAGENT, 'geoPlugin PHP Class v1.0'); 
      $response = curl_exec($ch); 
      curl_close ($ch); 

回答

1

問題是,您正在網頁瀏覽器中顯示數據,您發送的數據是UTF-8編碼的,而且您的瀏覽器不知道這一點。如果您將<meta charset="utf-8" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8">添加到HTML文檔的頭部,那應該可以解決您的問題。

沒有定義爲UTF-8字符集:

Without

隨着<meta charset="utf-8" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8">

With

或者,你可以有你的PHP腳本發送內容類型頭使用header('Content-Type:text/html; charset=utf-8');(或如果要使用純文本,請將text/html替換爲text/plain)。

參考:

根據RFC2616 Section 3.7.1

當沒有明確的字符集參數是由發送者提供 ,媒體亞型「文本」類型的 被定義爲具有 默認通過HTTP接收時,字符集值爲 「ISO-8859-1」。

這意味着如果您不指定字符集,將會(應該)使用ISO-8859-1,因此如果數據是UTF-8編碼,某些字符將不會正確顯示。

+1

我需要輸出一個字符串,所以我無法使用頁面元標記。我怎樣才能通過cURL設置內容類型 – AjayR

+0

我試過這樣,但它沒有工作。 $ hdrs = array('Content-type:text/html; charset = utf-8'); \t \t \t curl_setopt($ ch,CURLOPT_HTTPHEADER,$ hdrs); – AjayR

+0

@Ajay - 您是在網絡瀏覽器中輸出「文本」,將其保存爲文本文件還是將其輸出到控制檯? –

1

這看起來只是一個編碼問題。儘管您的瀏覽器通常可以自動檢測並採用最適合的編碼,但cURL的內部不能。我會研究curl_setopt()函數以查看可以傳遞哪些編碼選項。

+0

請檢查回答中的回答 – AjayR

+0

我會確保使用'curl_setopt($ ch,CURLOPT_ENCODING,'');'來「清零」接受的編碼,然後明確地發送一個'Content-type :application/json; charset ......無論charset是什麼......'HTTP標頭作爲cURL文章的一部分。 – jerluc

+0

我試過編碼,但沒有運氣。 – AjayR