谷歌地图API非英语地址问题(PHP/CURL)


Google Maps API issue with non-English addresses (PHP/CURL)

我正在用PHP/CURL实现谷歌地图服务,目前地图API有问题。我正在用英语和俄语地址向谷歌地图发送查询。英语地址运行良好,而俄语地址以602(找不到地址)失败

奇怪的是,如果我将带有俄语地址的粘贴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;
}

我在互联网上搜索了一下,发现了一些关于用户代理和&oe=utf8等等,但这些似乎都不起作用。同样让我困惑的是,这种方法在英语中非常适用于地址,但在俄语中却失败了。尽管将查询粘贴到浏览器中在这两种情况下都非常完美。

提前谢谢!

小更新:类似的查询

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

适用于Chrome,但不适用于Firefox(同602),而

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

在两个中都能正常工作

更新2var_dumping($data)返回

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

并且name字段与Chrome响应中的字段完全相同。

upd3好吧,问题是如果我稍微更改俄语的位置名称,Chrome和FF都会返回200和坐标。问题似乎是Chrome浏览器在与谷歌交流时更具"智慧"。重构了方法,因此无论当前的语言环境如何,位置名称都始终以英语提供。看起来最好不要使用谷歌和与英语不同的字符集。

同样让我困惑的是,这种方法在英语中非常适用于地址,但在俄语中却失败了。

你告诉谷歌期待UTF-8数据,但你可能在发送其他数据。UTF-8是双字节编码——普通的旧ASCII字符由一个字节组成,就像ASCII一样;俄语和其他两个或两个以上字符。这就是为什么英语字母表经常起作用,但一旦其他字符发挥作用,事情就会发生变化。最有可能的是,在西里尔字母进入查询之前,它们在某个地方被弄乱了(=存储为UTF-8以外的编码)。

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