2012-01-22 24 views
1

我正在使用PHP/CURL实施Google地图服务,目前地图API存在问题。 我正在用英语和俄语地址向Google地图发送查询。 英文地址正常工作,而俄罗斯地址失败(未找到地址)602Google Maps API问题与非英文地址(PHP/CURL)

奇怪的是,如果我复制粘贴卷曲查询与俄罗斯地址,浏览器,它工作正常(返回200和coords)使用。

我的代码是

public static function google_geolocator($geoloc){ 
    $geoloc = urlencode(implode(" ",$geoloc)); 
    $query = "http://maps.google.com/maps/geo?q={$geoloc}&sensor=true&oe=utf8"; 
    echo $query; 
    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_URL, $query); 
    curl_setopt($curl, CURLOPT_HEADER, 0); 
    curl_setopt($curl, CURLOPT_FAILONERROR, TRUE); 
    curl_setopt($curl, CURLOPT_VERBOSE, TRUE);  
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
    $json = curl_exec($curl); 
    curl_close($curl); 
    $data = json_decode($json, TRUE); 
    return $data; 
} 

我通过搜索互联网和想出在User-Agent和& OE = UTF8等一些黑客,但这些都不似乎工作。最让我困惑的是,这种方法与英文地址完全一致,但与俄文不一致。尽管在两种情况下将查询粘贴到浏览器中都是完美的。

预先感谢您!

小更新:查询像在Chrome

http://maps.google.com/maps/geo?q=%D0%A2%D0%B0%D0%B8%D0%BB%D0%B0%D0%BD%D0%B4+%D0%9A%D0%BE+%D0%9F%D1%85%D1%83%D0%BA%D0%B5%D1%82&sensor=true&oe=utf8 

作品,但不会在Firefox(同602)工作,而

http://maps.google.com/maps/geo?q=Thailand+Koh+Phuket&sensor=true&oe=utf8 

两个

工作正常upd2 var_dumping($ data)返回

{ 
"name": "Таиланд Ко Пхукет", 
"Status": { 
    "code": 602, 
    "request": "geocode" 
    } 
} 

和名称字段与Chrome响应中的名称字段完全相同。

upd3好吧,事情是如果我改变位置名称在俄罗斯咯,铬和FF返回200和坐标。问题似乎是Chrome在与Google进行通信时更加“智能”。重构的方法,所以位置名称总是以英文提供,而不管当前的语言环境是什么。看起来最好不要混淆Google和与英语不同的字符集。

+0

'$ geoloc'从哪里来,它的编码是什么? –

回答

3

让我困惑的主要原因是,这种方法与英语地址完全一致,但与俄罗斯失败。

您告诉Google期待UTF-8数据,但您可能会发送其他内容。 UTF-8是一种双字节编码 - 简单的旧ASCII字符由一个字节组成,就像在ASCII中一样;俄罗斯和其他两个或两个以上的字符。这就是为什么英文字母经常起作用,但是一旦其他角色出现,事情就会破裂。最有可能的是,在他们输入查询之前,您的西里尔文字符会变乱(=存储为UTF-8以外的编码)。

确保$geoloc中的值为UTF-8编码。如果他们来自一个文件,确保是UTF-8编码。如果它们来自数据库,请确保表和数据库连接使用UTF-8编码。

+0

$ geoloc是一个$数组($ country_name,$ location_name)。数组值从DB提供,对应的表编码是utf8_unicode_ci – paulus

+0

@paulus然后我会检查数据库连接(并做一个测试输出,看看这些字符是什么样子的) –

+0

数据库连接没问题,我有一个测试单位并可以立即在区域设置之间切换。我已经计算出Firefox和Chrome之间的输出差异,并相应地更新了问题。我想知道我能做些什么来弄清Chrome和Firefox的查询内幕。也许那么我可以找到问题 – paulus