2013-04-04 61 views
2

我試圖這樣做通過谷歌財經

訪問股票行情:

$quote = file_get_contents('http://finance.google.com/finance/info?client=ig&q=VSE:APG1L'); 
$json = str_replace("\n", "", $quote); 
$data = substr($json, 4, strlen($json) -5); 
print_r($data); 
$json_output = json_decode($data, true); 
print_r($json_output); 
echo "\n".$json_output['l']; 

json_decode想給我的鑰匙和值的普通陣列,但它不。

+2

這是什麼給你呢? – 2013-04-04 12:38:44

回答

1

如果你試圖json_decode()後看json_last_error()你會看到你所得到:

JSON_ERROR_UTF8 Malformed UTF-8 characters, possibly incorrectly encoded 

試試這個:

$quote = file_get_contents('http://finance.google.com/finance/info?client=ig&q=VSE:APG1L'); 
$json = substr($quote, 4, -5); 
$json_output = json_decode($json, true, JSON_UNESCAPED_UNICODE); 
print_r($json_output); 

參見:http://3v4l.org/jkInl

注意JSON_UNESCAPED_UNICODE只自PHP 5.4

另一種辦法是做...

$quote = utf8_decode($quote); 

...你以後把它拿來。這會將歐元符號轉換爲?字符。可能不是你想要的,但至少你得到json_decode來返回一個數組給你。

更新:在這裏看到更多的信息:

PHP decoding and encoding json with unicode characters

+0

'utf8_decode'不會改變''€到'\ u20AC',但到''?;這可能不是OP想要的。 – 2013-04-04 12:48:57

+0

@MarcelKorpel更新的答案,現在保留€(假設PHP 5.4) – jszobody 2013-04-04 13:02:54

+0

我還在做這個工作,所以OP不需要人至少PHP 5.4。順便說一句,對我來說,運行PHP 5.4.13,我仍然得到一個'JSON_ERROR_UTF8'。 – 2013-04-04 13:11:35

0

另一種方案是「手動」的\u20AC取代所有實例(這是歐元符號的Unicode字符點)。

$quote = file_get_contents('http://finance.google.com/finance/info?client=ig&q=VSE:APG1L'); 
$quote = str_replace(chr(128), '\u20AC', $quote); 
$json = substr($quote, 6, -3); // remove unnecessary '// [ … ]' 
$json_output = json_decode($json, true); 
print_r($json_output); 
+0

這隻修復一個症狀,而不是問題。 – 2013-04-04 13:33:01

+0

@JoeFrambach:問題*是*包含歐元符號的JSON。 'utf8_decode'將歐元符號轉換爲'?',所以這也不是解決方案。 – 2013-04-04 13:38:27

+0

是否還有其他可能出現的字符,具有相同的問題? – 2013-04-04 13:55:16