Код состояния 0 в API геокодирования Google с iPhone / sim, но отлично работает в Интернете (не английские символы) - PullRequest
2 голосов
/ 01 июня 2011

Попробуйте: 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)

В браузере я получаю:

   "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" ]
  }

], "статус": "OK"}

Другие запросы со стандартными английскими символами в них действительно работают и правильно возвращаются на устройстве.

1 Ответ

8 голосов
/ 01 июня 2011

В какой-то момент в вашем коде вы, вероятно, используете класс NSURL и:

Класс NSURL не сможет создать новый объект NSURL, если путь пройден не правильно - путь должны соответствовать RFC 2396. Примеры случаи, которые не удастся строки, содержащие пробелы и высокобитные персонажи. Должен создание объекта NSURL не удалось, методы создания возвращают ноль, который вы должен быть готов к обработке.

Вам необходимо преобразовать старшие биты в "Őrbottyán" в процентные значения, используя [NSString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], перед передачей строки в NSURL. Современные браузеры автоматически сделают это преобразование для вас, когда вы поместите несоответствующую строку в поле URL, но в коде вы должны сделать это явно.


Редактировать , чтобы включить в него выводы Quantumpotato ниже: Карты Google поступят правильно, если "Ő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];

Я подозреваю, что "преобразование с потерями в ASCII" может работать не на всех веб-сайтах, но оно было протестировано и проверено с помощью Google Maps, поэтому оно у вас есть. : -)

...