来自iPhone/SIM的Google地理编码API上的状态代码0,但在网络上正常工作(非英文字符)

qua*_*ato 2 iphone geocoding google-api reverse-geocoding

试试:http://maps.googleapis.com/maps/api/geocode/json?address =Őrbottyán,Hungary&sensor = true

在iPhone 4和模拟器上,

 -(void)requestFailed:(ASIHTTPRequest *)request {
   NSLog(@"geocode fail code: %d",[request responseStatusCode]);
   NSLog(@"geocoding failed: %@",[request responseString]);
}
2011-06-01 11:36:27.343 app[1174:307] geocode fail code: 0
2011-06-01 11:36:27.345 app[1174:307] geocoding failed: (null)
Run Code Online (Sandbox Code Playgroud)

在浏览器中,我得到:

   "results" : [
    {
    "address_components" : [
        {
           "long_name" : "?rbottyán",
           "short_name" : "?rbottyán",
           "types" : [ "locality", "political" ]
        },
        {
           "long_name" : "Pest",
           "short_name" : "Pest",
           "types" : [ "administrative_area_level_1", "political" ]
        },
        {
           "long_name" : "Hungary",
           "short_name" : "HU",
           "types" : [ "country", "political" ]
        }
     ],
     "formatted_address" : "?rbottyán, Hungary",
     "geometry" : {
        "bounds" : {
           "northeast" : {
              "lat" : 47.7138950,
              "lng" : 19.34353090
           },
           "southwest" : {
              "lat" : 47.63339999999999,
              "lng" : 19.2051070
           }
        },
        "location" : {
           "lat" : 47.6846190,
           "lng" : 19.2883260
        },
        "location_type" : "APPROXIMATE",
        "viewport" : {
           "northeast" : {
              "lat" : 47.7138950,
              "lng" : 19.34353090
           },
           "southwest" : {
              "lat" : 47.63339999999999,
              "lng" : 19.2051070
           }
        }
     },
     "types" : [ "locality", "political" ]
  }
Run Code Online (Sandbox Code Playgroud)

],"状态":"确定"}

其他带有标准英文字符的请求可以在设备上正常工作和返回.

Sco*_*bes 8

在您的代码中的某个时刻,您可能正在使用NSURL该类,并且:

该NSURL类将无法创建一个新的NSURL对象,如果传递的路径是没有很好地形成,该路径必须符合RFC是不会得逞的案件2396实例是包含空格字符和高比特字符的字符串.如果创建NSURL对象失败,则创建方法返回nil,您必须准备好处理它.

[NSString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]在将字符串传递给之前,您需要将"Őrbottyán"中的高位字符转换为百分比转义符NSURL.当您将不合规的字符串放入URL字段时,现代浏览器将默默地为您进行此转换,但在代码中您必须明确地执行此操作.


编辑包括quantumpotato的调查结果如下:谷歌地图会做正确的事情,如果"Őrbottyán"转换为"Orbottyan"(一个"有损"转换为ASCII编码),并转换能够往返通过执行NSData:

NSData *data = [urlString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *dataString = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSURL *url = [NSURL URLWithString:dataString];
[dataString release];
Run Code Online (Sandbox Code Playgroud)

我怀疑"有损转换为ASCII"可能不适用于所有网站,但它已经过Google地图测试和验证,所以你有它.:-)