Специальные символы в Xcode / ios5 для SBJso - PullRequest
2 голосов
/ 26 декабря 2011

У меня проблема с отправкой специальных символов на iOS5 через sbjson в веб-сервис. Я получаю ошибку:

- [NSNull isEqualToString:]: нераспознанный селектор, отправленный на экземпляр

Я попытался отправить строку json без специальных символов, и она прошла без проблем. Но как только я ввожу некоторые специальные символы, такие как «æøå» или «é», я получаю ошибку выше.

Я просмотрел множество ответов по json и iOS здесь, но в основном это ответы о специальных символах в строке URL-адреса веб-службы. Для чего я могу определить, что вся строка также закодирована в UTF-8 через SBJson.

Кто-нибудь, кто сталкивался с такой же проблемой, и знает какие-либо решения для этого?

Заранее спасибо.

Это происходит при отправке запроса на сервер.

Это код, который я использую при отправке запроса.

-(void) execMethod:(NSString*)methodName andParams:(NSArray*)parameters withID:(NSString*)identificator {

//RPC
NSMutableDictionary* reqDict = [NSMutableDictionary dictionary];
[reqDict setObject:methodName forKey:@"method"];
[reqDict setObject:parameters forKey:@"params"];
[reqDict setObject:identificator forKey:@"id"];

//RPC JSON
NSString* reqString = [NSString stringWithString:[reqDict JSONRepresentation]];

//Request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
NSData* requestData = [NSData dataWithBytes:[reqString UTF8String] length:[reqString length]];

//prepare http body
[request setHTTPMethod: @"POST"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody: requestData];

if (urlConnection != nil) {
    [urlConnection release];
    urlConnection = nil;
}

urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
[request release];

UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES;

}

Трассировка стека:

0   xRapp                               0x00015925 -[JSONRPCService execMethod:andParams:withID:] + 1077
1   xRapp                               0x00017eaa -[xRappSyncWSViewController syncServerUpdate:] + 2586
2   xRapp                               0x000187a7 -[xRappSyncWSViewController data1Loaded:] + 2167
3   xRapp                               0x000171d3 -[xRappSyncWSViewController dataLoaded:] + 627
4   xRapp                               0x00015da8 -[JSONRPCService connectionDidFinishLoading:] + 200
5   Foundation                          0x00eb8a59 ___NSURLConnectionDidFinishLoading_block_invoke_0 + 40
6   Foundation                          0x00eb6e94 __65-[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]_block_invoke_0 + 40
7   Foundation                          0x00eb7eb7 -[NSURLConnectionInternalConnection invokeForDelegate:] + 39
8   Foundation                          0x00eb6e4f -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:] + 201
9   Foundation                          0x00eb6fd5 -[NSURLConnectionInternal _withActiveConnectionAndDelegate:] + 76
10  Foundation                          0x00dfbf6a _NSURLConnectionDidFinishLoading + 43
11  CFNetwork                           0x01998bbd _ZN19URLConnectionClient23_clientDidFinishLoadingEPNS_26ClientConnectionEventQueueE + 241
12  CFNetwork                           0x01a655ea _ZN19URLConnectionClient26ClientConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XClientEvent18XClientEventParamsEl + 584
13  CFNetwork                           0x0198f298 _ZN19URLConnectionClient13processEventsEv + 174
14  CFNetwork                           0x01a6516b _ZThn52_N25URLConnectionInstanceData24multiplexerClientPerformEv + 21
15  CFNetwork                           0x0198f137 _ZN17MultiplexerSource7performEv + 259
16  CoreFoundation                      0x0120b97f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
17  CoreFoundation                      0x0116eb73 __CFRunLoopDoSources0 + 243
18  CoreFoundation                      0x0116e454 __CFRunLoopRun + 1012
19  CoreFoundation                      0x0116ddb4 CFRunLoopRunSpecific + 212
20  CoreFoundation                      0x0116dccb CFRunLoopRunInMode + 123
21  GraphicsServices                    0x01eef879 GSEventRunModal + 207
22  GraphicsServices                    0x01eef93e GSEventRun + 114
23  UIKit                               0x004c3a9b UIApplicationMain + 1175
24  xRapp                               0x000021f8 main + 152
25  xRapp                               0x00002155 start + 53

1 Ответ

2 голосов
/ 27 декабря 2011

Кажется, что ваша трассировка стека - это просто трассировка стека подозрительного метода, но не трассировка стека возникшей ошибки. См. Разбивка нераспознанного селектора , чтобы узнать, как установить точку останова, чтобы поймать точное местоположение. Как только он останавливается на точке останова, вы получаете трассировку стека с лучшей информацией.

Сказав это, в вашем коде есть одна подозрительная строка:

NSData* requestData = [NSData dataWithBytes:[reqString UTF8String] length:[reqString length]];

В этих строках смешиваются длина строки (измеряется в символах) и длина двоичных данных в кодировке UTF-8 (измеряется в байтах). Они отличаются, если у вас есть специальные символы, такие как буквы с акцентами.

Лучшая (и более короткая) альтернатива:

NSData* requestData = [reqString dataUsingEncoding:NSUTF8StringEncoding];

Если это не решение, добавьте улучшенную трассировку стека.

...