【问题标题】:? marks coming from reverse geocoded response?来自反向地理编码响应的标记
【发布时间】:2011-07-07 18:04:32
【问题描述】:

因此,来自俄罗斯的某个人从我的网站做出了反向地理编码响应。我在客户端解析 Json 并将城市和州连接成一个字符串。这就是那个串联的字符串最终变成的样子:

???? ?????-?????????, ??????

在任何情况下 Google 会发送吗?从反向地理编码响应中通过 Json 标记回来?纬度/经度是正确的。当我直接通过浏览器发布相同的 Json 帖子时,我得到了正确的响应:

http://maps.googleapis.com/maps/api/geocode/json?latlng=60.0486851,30.3197483&sensor=true

有人有什么想法吗?

可能是因为我从美国访问 Json,而他从俄罗斯访问它?

编辑:连接发生在这里:

首先我得到结果:

geocoder.geocode({'latLng': realUsersLoc}, function(results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
        if (results[1]) { 
            var loc = getCityState(results);

    function getCityState(results)
{
    var city = '';
    var state = '';
    var bad = '';
    var good = '';
    var us = true;
    // check for non-us
    for (var i = 0; i < results[0].address_components.length; i++)
    {
        var shortname = results[0].address_components[i].short_name;
        var longname = results[0].address_components[i].long_name;
        var type = results[0].address_components[i].types;
        if (type.indexOf("country") != -1)
        {
            if (!isNullOrWhitespace(shortname))
            {
                us = (shortname == 'US');
            }
            else
            {
                us = (longname == 'United States');
            }
        }
    }
    if (!us)
    {
        for (var i = 0; i < results[0].address_components.length; i++)
        {
            var shortname = results[0].address_components[i].short_name;
            var longname = results[0].address_components[i].long_name;
            var type = results[0].address_components[i].types;
            if (type.indexOf("country") != -1)
            {
                if (!isNullOrWhitespace(longname))
                {
                    state = longname;
                }
                else
                {
                    state = shortname;
                }
            }
            if (type.indexOf("administrative_area_level_1") != -1)
            {
                if (!isNullOrWhitespace(shortname))
                {
                    city = shortname;
                }
                else
                {
                    city = longname;
                }
            }
            else if (type.indexOf("locality") != -1)
            {
                if (!isNullOrWhitespace(shortname))
                {
                    city = shortname;
                }
                else
                {
                    city = longname;
                }
            }
        }
    }
    else
    {
        // us
        for (var i = 0; i < results[0].address_components.length; i++)
        {
            var shortname = results[0].address_components[i].short_name;
            var longname = results[0].address_components[i].long_name;
            var type = results[0].address_components[i].types;
            if (type.indexOf("administrative_area_level_1") != -1)
            {
                if (!isNullOrWhitespace(shortname))
                {
                    state = shortname;
                }
                else
                {
                    state = longname;
                }
            }
            else if (type.indexOf("locality") != -1)
            {
                if (!isNullOrWhitespace(shortname))
                {
                    city = shortname;
                }
                else
                {
                    city = longname;
                }
            }
            else if (type.indexOf("administrative_area_level_3") != -1)
            {
                if (!isNullOrWhitespace(shortname))
                {
                    good = shortname;
                }
                else
                {
                    good = longname;
                }
            }
            else if (type.indexOf("administrative_area_level_2") != -1)
            {
                if (!isNullOrWhitespace(shortname))
                {
                    bad = shortname;
                }
                else
                {
                    bad = longname;
                }
            }
        }
        if (city == '')
        {
            if (good != '')
            {
                city = good;
            }
            else
            {
                city = bad;
            }
        }
    }
    if (isNullOrWhitespace(city) && isNullOrWhitespace(state))
    {
        return 'N/A';
    }
    if (isNullOrWhitespace(city))
    {
        return state;
    }
    else if (isNullOrWhitespace(state))
    {
        return city;
    }
    return (city + ', ' + state)
}

【问题讨论】:

  • 你能发布你是如何连接字符串的吗?
  • 浏览器文本编码可能吗?
  • 是的,我同意 Brad 我认为这是浏览器编码问题。
  • @smoak - 已发布。 @brad - 我使用的是 utf-8,我该如何解决?
  • 它们将是未正确表示的西里尔字符。而且您的地理位置与互联网上的任何事情都没有任何关系!

标签: javascript json google-maps-api-3 reverse-geocoding


【解决方案1】:

考虑到带有问号的破折号的存在,这似乎极有可能是字符集问题,而不是 Google 发回问号的情况。 (您有多确定您的网站将 UTF-8 指定为其字符集?)如果您不关心国际化,那么您可以通过在 URL 中使用 language 参数将结果强制转换为英文来解决此问题(见下文)。当然,这并不理想,但对于某些用途来说可能是可以接受的。

如果上述解决方法不可接受,请尝试使用来自http://maps.googleapis.com/maps/api/geocode/json?latlng=60.0486851,30.3197483&sensor=true&language=ru 的结果运行您的代码(注意在末尾附加的language 参数以强制它返回俄语数据)在各种浏览器看看你是否可以复制问号问题。 (如果您知道用户遇到问题时使用的浏览器/平台,那就更好了。)

【讨论】:

  • 这似乎是迄今为止最接近的解决方案。我回家后会试一试。
【解决方案2】:

也许此人的回复是以西里尔文或其他语言返回的内容,而您的字符集不正确?

【讨论】:

  • 当唯一的区别是他们在哪个国家时,他们的反应会有所不同吗?因为在我工作的地方做同样的帖子......
  • 也许他要求以另一种语言返回?想知道吗?
  • 嗯,请求是从我的代码生成的......嗯...... idk这令人困惑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
相关资源
最近更新 更多