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

非英语地址的谷歌地图API问题(PHP/CURL),php,google-maps,curl,Php,Google Maps,Curl,我正在用PHP/CURL实现googlemaps服务,目前mapsapi有一个问题。 我正在用英语和俄语地址向谷歌地图发送查询。 英文地址可以正常工作,而俄文地址不能使用602(找不到地址) 奇怪的是,若我将带有俄语地址的粘贴curl查询复制到浏览器中,它就可以正常工作(返回200和coords) 我的代码是 public static function google_geolocator($geoloc){ $geoloc = urlencode(implode(" ",$geoloc

我正在用PHP/CURL实现googlemaps服务,目前mapsapi有一个问题。 我正在用英语和俄语地址向谷歌地图发送查询。 英文地址可以正常工作,而俄文地址不能使用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等的黑客行为,但这些似乎都不起作用。再次让我困惑的主要问题是,这种方法完全适用于英语中的address,但不适用于俄语。尽管将查询粘贴到浏览器中在这两种情况下都能很好地工作

提前谢谢你

小更新:类似查询

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),而

两者都很好

upd2 var_转储($data)返回

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

upd3好吧,如果我稍微改变一下俄语的位置名称,Chrome和FF都返回200和坐标。问题似乎是Chrome在与谷歌交流时更“智能化”。重构方法,因此无论当前语言环境是什么,位置名称始终以英语提供。看起来最好不要搞乱谷歌和与英语不同的字符集

再次让我困惑的主要问题是,这种方法完全适用于英语中的address,但不适用于俄语

你告诉谷歌需要UTF-8数据,但你可能在发送其他信息。UTF-8是一种双字节编码——普通的旧ASCII字符由一个字节组成,就像在ASCII中一样;两个或两个以上的俄文和其他字符。这就是为什么英语字母表经常起作用,但一旦其他字符开始起作用,事情就会破裂。最有可能的是,您的西里尔文字符在进入您的查询之前在某个地方被乱码(=存储为UTF-8以外的编码)

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

再次让我困惑的主要问题是,这种方法完全适用于英语中的address,但不适用于俄语

你告诉谷歌需要UTF-8数据,但你可能在发送其他信息。UTF-8是一种双字节编码——普通的旧ASCII字符由一个字节组成,就像在ASCII中一样;两个或两个以上的俄文和其他字符。这就是为什么英语字母表经常起作用,但一旦其他字符开始起作用,事情就会破裂。最有可能的是,您的西里尔文字符在进入您的查询之前在某个地方被乱码(=存储为UTF-8以外的编码)


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

从哪里来的
$geoloc
是什么编码?从哪里来的
$geoloc
是什么编码?$geoloc是一个$array($country\u name,$location\u name)。数组值由DB提供,对应的表编码为utf8\U unicode_ci@paulus然后我会检查数据库连接(并进行测试输出以查看字符的外观)数据库连接是否正常,我有一个用于此方法的测试单元,可以立即在区域设置之间切换。我已经找出了Firefox和Chrome在输出上的差异,并相应地更新了这个问题。我想知道我能做些什么来找出来自Chrome和Firefox的查询的内部信息。也许到时候我就能找到problem@paulus
echo$geoloc是什么给你看?(请确保包含脚本的字符集信息-您可以在浏览器的“编码”菜单中看到它)最好在urlencode()英语泰国+Koh+普吉俄语之前:%D0%A2%D0%B0%D0%B0%BB%D0%B0%D0%D0%B4+%D0%9A%D0%BE+%D0%9F%D1%85%D1%83%D0%BA%D0%B5%D1%82 FF和Chrome都有UTF-8$geoloc数组($country\u name,$location\u name)。数组值由数据库提供,相应的表编码为utf8\u unicode_ci@paulus然后我将检查数据库连接(并进行测试输出以查看字符的外观)数据库连接很好,我有一个用于此方法的测试单元,可以立即在区域设置之间切换。我已经计算出Firefox和Chrome之间的输出差异,并相应地更新了问题。我想知道如何从Chrome和Firefox中找出查询的内部内容。也许这样我就能找到problem@paulusa代表什么n
echo$geoloc;
show you?(确保包含脚本的字符集信息-您可以在浏览器的“encoding”菜单中看到它),最好在urlencode()之前泰国英语+Koh+普吉俄语:%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 FF和Chrome都有UTF-8
http://maps.google.com/maps/geo?q=Thailand+Koh+Phuket&sensor=true&oe=utf8
{
"name": "Таиланд Ко Пхукет",
"Status": {
    "code": 602,
    "request": "geocode"
    }
}