2012-02-02 41 views
0

當我嘗試顯示字符串的字符串,我的應用程序崩潰:想我的應用程序崩潰時獲取包含特殊字符

NSLog(@"The start point is: %@",startPt); 

這是startPt值:39-49%20Avenue%20d'Ivry,%2075013%20Paris,%20France。實際上它是從Google Maps網絡服務返回的。

有時,應用程序沒有崩潰,但我得到了在登錄奇怪的事情:

The start point is: text/javascript 

爲什麼我無法將字符串39-49%20Avenue%20d'Ivry,%2075013%20Paris,%20France分配給NSString變量?

編輯:

這裏是JSON響應解析:

NSString *responseString=[request responseString]; 
NSDictionary *responseDict=[responseString JSONValue]; 

NSArray *resultsArray = [responseDict objectForKey:@"results"]; 

location=[[resultsArray valueForKey:@"formatted_address"] objectAtIndex:0]; 
      location=[location stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
      NSLog(@"The location is : %@",location);//39-49%20Avenue%20d'Ivry,%2075013%20Paris,%20France 

,這是從谷歌地圖API返回的JSON響應:

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "39-49", 
       "short_name" : "39-49", 
       "types" : [ "street_number" ] 
      }, 
      { 
       "long_name" : "Avenue d'Ivry", 
       "short_name" : "Avenue d'Ivry", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "Quartier de la Gare", 
       "short_name" : "Quartier de la Gare", 
       "types" : [ "neighborhood", "political" ] 
      }, 
      { 
       "long_name" : "13th arrondissement of Paris", 
       "short_name" : "13th arrondissement of Paris", 
       "types" : [ "sublocality", "political" ] 
      }, 
      { 
       "long_name" : "Paris", 
       "short_name" : "Paris", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Paris", 
       "short_name" : "75", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Île-de-France", 
       "short_name" : "IdF", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "France", 
       "short_name" : "FR", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "75013", 
       "short_name" : "75013", 
       "types" : [ "postal_code" ] 
      } 
     ], 
     "formatted_address" : "39-49 Avenue d'Ivry, 75013 Paris, France", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 48.82332110, 
        "lng" : 2.36638740 
       }, 
       "southwest" : { 
        "lat" : 48.82296810, 
        "lng" : 2.36571090 
       } 
      }, 
      "location" : { 
       "lat" : 48.82313960, 
       "lng" : 2.36602210 
      }, 
      "location_type" : "RANGE_INTERPOLATED", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 48.82449358029150, 
        "lng" : 2.367398130291502 
       }, 
       "southwest" : { 
        "lat" : 48.82179561970850, 
        "lng" : 2.364700169708498 
       } 
      } 
     }, 
     "types" : [ "street_address" ] 
     }, 
     { 
     "address_components" : [ 
      { 
       "long_name" : "Quartier de la Gare", 
       "short_name" : "Quartier de la Gare", 
       "types" : [ "neighborhood", "political" ] 
      }, 
      { 
       "long_name" : "13th arrondissement of Paris", 
       "short_name" : "13th arrondissement of Paris", 
       "types" : [ "sublocality", "political" ] 
      }, 
      { 
       "long_name" : "Paris", 
       "short_name" : "Paris", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Paris", 
       "short_name" : "75", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Île-de-France", 
       "short_name" : "IdF", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "France", 
       "short_name" : "FR", 
       "types" : [ "country", "political" ] 
      } 
     ], 
     "formatted_address" : "Quartier de la Gare, Paris, France", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 48.83810700000001, 
        "lng" : 2.3869610 
       }, 
       "southwest" : { 
        "lat" : 48.8189240, 
        "lng" : 2.3556050 
       } 
      }, 
      "location" : { 
       "lat" : 48.82807520, 
       "lng" : 2.36740680 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 48.83810700000001, 
        "lng" : 2.3869610 
       }, 
       "southwest" : { 
        "lat" : 48.8189240, 
        "lng" : 2.3556050 
       } 
      } 
     }, 
     "types" : [ "neighborhood", "political" ] 
     }, 
     { 
     "address_components" : [ 
      { 
       "long_name" : "13th arrondissement of Paris", 
       "short_name" : "13th arrondissement of Paris", 
       "types" : [ "sublocality", "political" ] 
      }, 
      { 
       "long_name" : "Paris", 
       "short_name" : "Paris", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Paris", 
       "short_name" : "75", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Île-de-France", 
       "short_name" : "IdF", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "France", 
       "short_name" : "FR", 
       "types" : [ "country", "political" ] 
      } 
     ], 
     "formatted_address" : "13th arrondissement of Paris, Paris, France", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 48.84496499999999, 
        "lng" : 2.3900530 
       }, 
       "southwest" : { 
        "lat" : 48.8155730, 
        "lng" : 2.3411080 
       } 
      }, 
      "location" : { 
       "lat" : 48.83222220, 
       "lng" : 2.35555560 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 48.84496499999999, 
        "lng" : 2.3900530 
       }, 
       "southwest" : { 
        "lat" : 48.8155730, 
        "lng" : 2.3411080 
       } 
      } 
     }, 
     "types" : [ "sublocality", "political" ] 
     }, 
     { 
     "address_components" : [ 
      { 
       "long_name" : "75013", 
       "short_name" : "75013", 
       "types" : [ "postal_code" ] 
      }, 
      { 
       "long_name" : "Paris", 
       "short_name" : "Paris", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Paris", 
       "short_name" : "75", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Île-de-France", 
       "short_name" : "IdF", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "France", 
       "short_name" : "FR", 
       "types" : [ "country", "political" ] 
      } 
     ], 
     "formatted_address" : "75013 Paris, France", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 48.84493089999999, 
        "lng" : 2.39026440 
       }, 
       "southwest" : { 
        "lat" : 48.81587960, 
        "lng" : 2.34112720 
       } 
      }, 
      "location" : { 
       "lat" : 48.8307590, 
       "lng" : 2.3592040 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 48.84493089999999, 
        "lng" : 2.39026440 
       }, 
       "southwest" : { 
        "lat" : 48.81587960, 
        "lng" : 2.34112720 
       } 
      } 
     }, 
     "types" : [ "postal_code" ] 
     }, 
     { 
     "address_components" : [ 
      { 
       "long_name" : "Paris", 
       "short_name" : "Paris", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Paris", 
       "short_name" : "75", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Île-de-France", 
       "short_name" : "IdF", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "France", 
       "short_name" : "FR", 
       "types" : [ "country", "political" ] 
      } 
     ], 
     "formatted_address" : "Paris, France", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 48.9021450, 
        "lng" : 2.46992090 
       }, 
       "southwest" : { 
        "lat" : 48.8155730, 
        "lng" : 2.2241990 
       } 
      }, 
      "location" : { 
       "lat" : 48.8566140, 
       "lng" : 2.35222190 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 48.9021450, 
        "lng" : 2.46992090 
       }, 
       "southwest" : { 
        "lat" : 48.8155730, 
        "lng" : 2.2241990 
       } 
      } 
     }, 
     "types" : [ "locality", "political" ] 
     }, 
     { 
     "address_components" : [ 
      { 
       "long_name" : "Paris", 
       "short_name" : "75", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Île-de-France", 
       "short_name" : "IdF", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "France", 
       "short_name" : "FR", 
       "types" : [ "country", "political" ] 
      } 
     ], 
     "formatted_address" : "Paris, France", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 48.9021450, 
        "lng" : 2.46992090 
       }, 
       "southwest" : { 
        "lat" : 48.8155730, 
        "lng" : 2.2241990 
       } 
      }, 
      "location" : { 
       "lat" : 48.87633370, 
       "lng" : 2.34612070 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 48.9021450, 
        "lng" : 2.46992090 
       }, 
       "southwest" : { 
        "lat" : 48.8155730, 
        "lng" : 2.2241990 
       } 
      } 
     }, 
     "types" : [ "administrative_area_level_2", "political" ] 
     }, 
     { 
     "address_components" : [ 
      { 
       "long_name" : "Île-de-France", 
       "short_name" : "IdF", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "France", 
       "short_name" : "FR", 
       "types" : [ "country", "political" ] 
      } 
     ], 
     "formatted_address" : "Île-de-France, France", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 49.2415040, 
        "lng" : 3.5590070 
       }, 
       "southwest" : { 
        "lat" : 48.1200810, 
        "lng" : 1.446170 
       } 
      }, 
      "location" : { 
       "lat" : 48.84991980, 
       "lng" : 2.63704110 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 49.2415040, 
        "lng" : 3.5590070 
       }, 
       "southwest" : { 
        "lat" : 48.1200810, 
        "lng" : 1.446170 
       } 
      } 
     }, 
     "types" : [ "administrative_area_level_1", "political" ] 
     }, 
     { 
     "address_components" : [ 
      { 
       "long_name" : "France", 
       "short_name" : "FR", 
       "types" : [ "country", "political" ] 
      } 
     ], 
     "formatted_address" : "France", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 51.08896180, 
        "lng" : 9.559956999999999 
       }, 
       "southwest" : { 
        "lat" : 41.34232760, 
        "lng" : -5.1412280 
       } 
      }, 
      "location" : { 
       "lat" : 46.2276380, 
       "lng" : 2.2137490 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 51.08896180, 
        "lng" : 9.559956999999999 
       }, 
       "southwest" : { 
        "lat" : 41.34232760, 
        "lng" : -5.1412280 
       } 
      } 
     }, 
     "types" : [ "country", "political" ] 
     } 
    ], 
    "status" : "OK" 
} 
+1

你能發表更多的周邊代碼和情況嗎?你在問題中提到的內容不會崩潰。有問題的字符串是%轉義,%20是空格。所以你可以使用[startPt stringByReplacingPercentEscapesUsing:NSUTF8StringEncoding]來擺脫它們,但這可能無法解決崩潰問題的實際原因。 – Diziet 2012-02-02 15:18:59

+1

崩潰的原因很可能是該字符串被過早釋放:我已經看到'NSLog'處理非常奇特的字符而沒有問題,所以它不太可能會在百分號上窒息。 – dasblinkenlight 2012-02-02 15:21:00

+0

@Diziet:我會檢查你的建議並回復給你:) – Luca 2012-02-02 15:23:26

回答

1

我能想到的兩種可能性:


(1)爲什麼你認爲字符串是ASCII?嘗試不同的編碼:

location = [location stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

或許谷歌正在使用一個Unicode ,而不是一個ASCII字符集內?如果你正在查看地址數據,那麼你可以相當確定奇怪的角色會被放在那裏!


和(2)(這個人是更不可能給你已經張貼了JSON在你的問題,但值得思考)

當你第一次得到location你不檢查,它實際上一個字符串(你不檢查「的formatted_address」是一個數組要麼!)

如果什麼JSON返回是這樣(說沒有在服務器中的錯誤?):

{ 
    ... 
    "formatted_address" : [ { } ] 
    ... 
} 

這裏,[[resultsArray valueForKey:@"formatted_address"] objectAtIndex:0];可以工作,但它不會返回NSString

嘗試這種檢查補充說:

location=[[resultsArray valueForKey:@"formatted_address"] objectAtIndex:0]; 
if (NO == [location isKindOfClass:[NSString class]]) { 
    NSLog(@"Location wasn't a string (%@) : %@", [location class], location); 
} else { 
    location=[location stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
    NSLog(@"The location is : %@",location);//39-49%20Avenue%20d'Ivry,%2075013%20Paris,%20France 
} 
+0

你好,它總是進入'else'塊,所以它是一個字符串,我確信它。讓我們保持聯繫 – Luca 2012-02-02 16:24:32

+0

嗯,嘗試將編碼從ascii更改爲utf8怎麼樣 - 這是否有所作爲? – deanWombourne 2012-02-02 23:01:03

0

我的猜測是,startPt不是一個NSString,而是char*。如果是這種情況,從它創建一個NSString的最簡單的方法是[NSString stringWithFormat:@"%s", startPt]

+0

如果它在NSDictionary中,它不會是char *,NSDictionaries只存儲對象。 – Diziet 2012-02-02 17:30:03

+0

他說這是一個「字符串」。 – 2012-02-02 19:51:57

+0

這並沒有解決@ Diziet的評論 - 如果它來自JSON解析並且在NSDictionary中,那麼我們可以假設'String'的意思是'NSString' – deanWombourne 2012-02-02 23:00:08