2013-04-04 85 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